2012-01-10 3 views
18

Я хочу ответить на события касания (в частности, UIControlEventTouchUpInside и UIControlEventTouchUpOutside) на UITextField, но единственное событие, которое проходит, - UIControlEventTouchCancel.Как я могу реагировать на события касания на UITextField?

Я не могу использовать UIControlEventEditingDidBegin, потому что это происходит только тогда, когда поле получает фокус, а это не то, что я пытаюсь обнаружить. Я хочу знать, когда пользователь поднимает палец и находится ли он внутри или вне текстового поля, независимо от текущего состояния фокусировки.

Кто-нибудь знает, как это осуществить?

Чтобы быть ясным, я пробовал использовать addTarget:action:forControlEvents и он не работает. Отмена отменяется. Я хочу, чтобы обнаружить контакт до доUITextField потребляет его и производит событие Отмена.

Кроме того, я хотел бы избежать создания дополнительных просмотров, если это возможно.

ответ

-1

Добавить цель для желаемого события программно или использовать IB.

UITextField * touchyTextField = [[UITextField alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 21.0)]; 

[touchyTextField addTarget:self 
        action:@selector(yourDesiredMethod) 
      forControlEvents:UIControlEventTouchUpInside]; 
+7

Нет, это определенно не работает. Первое, что я пробовал. Метод «yourDesiredMethod» никогда не вызывается. Я могу получить события для UIControlEventTouchDown, но ни одно из событий TouchUp не запускается. Вместо этого запускается событие UIControlEventTouchCancel. Я не могу просто использовать это событие как хакерский прокси для события, которое я хочу, потому что он также запускается, когда длительное нажатие вызывает цикл увеличения и когда что-то еще отменяет ввод пользователя, например модальный диалог или экран блокировки , – theK42

+0

Вау, я предполагал, что он будет работать, как и любой другой класс на основе UIView. Вы можете создать пользовательский UITextField и переопределить метод touchhesBegan:, чтобы стать первым ответчиком в соответствующих случаях, так что клавиатура все еще показывает. –

+0

Итак, я попробовал переопределить штрихиBegan/Ended/Canceled, и это также дало мне пару Began/Canceled без события Ended. Это действительно расстраивает! Кроме того, переопределение этих методов не помешало textField стать первым ответчиком, поэтому базовый класс делает обработку касания, прежде чем я получу шанс! – theK42

4

Ну окрест способ сделать это было бы создать UIButton с заполнением набора для очистки, чтобы охватить все пространство и UITextField поверх него. Если пользователь коснется текстового поля, текстовое поле должно отправить событие, и если пользователь коснется вне текстового поля, UIButton отправит событие.

+0

Поскольку я не могу получить событие от касания внутри TextField, это не сработает. Я также хотел бы избежать создания дополнительных просмотров, если это возможно. – theK42

2

Хороший ответ здесь: Change default touch events for UITextField

Используйте делегат текстового поля и делать то, что вы хотите сделать в textFieldShouldBeginEditing:

Вы можете вернуть NO, чтобы предотвратить поведение по умолчанию.

+0

Это не бесполезная информация, это может помочь мне приблизиться к поведению, которое я хочу. Это не полный ответ, хотя, поскольку он не может помочь мне обнаружить штрихи, которые начинаются внутри и заканчиваются за пределами поля, как это делает UIControlEventTouchUpOutside. – theK42

+0

Конечно. Я должен был правильно прочитать ваш вопрос! – beev

+0

Слово предостережения здесь. Этот метод запускается чаще, чем просто нажатие, например, при нажатии вкладки на внешней клавиатуре для перемещения текстовых полей. Протестировано на iOS 9. –

0

Я столкнулся с этой проблемой только сегодня. Моя цель состояла в том, чтобы изменить цвет фона текстового поля при касании и вернуть его назад при касании/отмене. Странно, что сенсорный снимок отправляется в цель из UITextField, но прикоснитесь к нему, коснитесь снаружи и даже нажмите «Отменить». Я нашел решение. Это просто. Просто создайте подкласс UITextField и переопределите atthesEnded: и коснитесьCancelled :.

@interface TextField : UITextField 

@end 

@implementation CuteTextField 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touchesEnded:touches withEvent:event]; 
    self.backgroundColor=GetDefaultBackgroundColor(); 
} 

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touchesCancelled:touches withEvent:event]; 
    self.backgroundColor=GetDefaultBackgroundColor(); 
} 

@end 
1

Вы можете создать категорию для UiView и переопределить прикосновенияBegan meathod следующим образом.

Он отлично работает для меня. И это централизованное решение этой проблемы.

#import "UIView+Keyboard.h" 
@implementation UIView(Keyboard) 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.window endEditing:true]; 
    [super touchesBegan:touches withEvent:event]; 
} 


@end 
Смежные вопросы