Как я могу реагировать на события касания на UITextField?
Я хочу ответить на события касания (в частности UIControlEventTouchUpInside
и UIControlEventTouchUpOutside
) на UITextField
, но единственным событием, которое проходит, является UIControlEventTouchCancel
.
Я не могу использовать UIControlEventEditingDidBegin
, потому что это происходит только тогда, когда поле получает фокус, и это не то, что я пытаюсь обнаружить. Я хочу знать, когда пользователь поднимает палец и находится ли он внутри или вне текстового поля, независимо от текущего состояния фокусировки.
Кто-нибудь знает, как это сделать?
Чтобы быть ясным, я пробовал использовать addTarget:action:forControlEvents
, и он не работает. Отмена отменяется. Мне нужен способ обнаружения касания до того, как UITextField
потребляет его и выдает событие Cancel.
Кроме того, я хотел бы избежать создания каких-либо дополнительных представлений, если это возможно.
Ответы
Ответ 1
Ну, круглый способ сделать это - создать UIButton с набором заливки, чтобы очистить, чтобы покрыть все пространство, и UITextField поверх него. Если пользователь коснется текстового поля, текстовое поле должно отправить событие, и если пользователь коснется вне текстового поля, UIButton отправит событие.
Ответ 2
Хороший ответ здесь:
Изменить события касания по умолчанию для UITextField
Используйте делегат текстового поля и сделайте то, что вы хотите сделать в textFieldShouldBeginEditing:
Вы можете вернуть NO, чтобы предотвратить поведение по умолчанию.
Ответ 3
Вы можете создать категорию для UiView и переопределить meathod touchsBegan следующим образом.
Он отлично работает для меня. И это централизованное решение этой проблемы.
#import "UIView+Keyboard.h"
@implementation UIView(Keyboard)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.window endEditing:true];
[super touchesBegan:touches withEvent:event];
}
@end
Ответ 4
Я столкнулся с этой проблемой только сегодня. Моя цель состояла в том, чтобы изменить цвет фона текстового поля при касании и вернуть его обратно при касании/отмене.
Странно, что сенсорный снимок отправляется на цель из 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
Ответ 5
Добавить цель для желаемого события программно или использовать IB.
UITextField * touchyTextField = [[UITextField alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 21.0)];
[touchyTextField addTarget:self
action:@selector(yourDesiredMethod)
forControlEvents:UIControlEventTouchUpInside];