Подтвердить что ты не робот

Как я могу реагировать на события касания на UITextField?

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 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];