Событие потери фокуса UITextField

у меня есть UITextField в классе MyCustomUIView, и когда UITextField теряет фокус, я хотел бы скрыть поле и показать что-то еще на месте.

делегат UITextField установлено значение MyCustomUIView через IB, и у меня также есть "did End On Exit" и "Editing Did End" события, указывающие на IBAction способ в MyCustomUIView.

@interface MyCustomUIView : UIView { 

IBOutlet UITextField    *myTextField;

}

-(IBAction)textFieldLostFocus:(UITextField *)textField;

@end

однако ни одно из этих событий, похоже, не увольняется, когда UITextField теряет фокус. Как вы ловите / ищете это событие?

делегат UITextField определяется как MyCustomUIView Итак, я получаю textFieldShouldReturn сообщение, чтобы закрыть клавиатуру, когда сделано.

но меня также интересует, когда пользователь нажимает какую-то другую область на экране (скажем, другой элемент управления или просто пустую область), и текстовое поле потеряло фокус.

6 ответов


Я считаю, что вам нужно обозначить свое представление как делегат UITextField следующим образом:

@interface MyCustomUIView : UIView <UITextFieldDelegate> { 

в качестве дополнительного бонуса, это то, как вы получаете клавиатуру, чтобы уйти, когда они нажимают кнопки" Готово " или "возврат", в зависимости от того, как вы установили это свойство:

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
  //This line dismisses the keyboard.       
  [theTextField resignFirstResponder];
  //Your view manipulation here if you moved the view up due to the keyboard etc.       
  return YES;
}

попробуйте использовать делегат для следующего метода:

- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"Lost Focus for content: %@", textField.text);
    return YES;
}

это сработало для меня.


проблема с resignFirstResponder решение исключительно в том, что оно может быть вызвано только явным клавиатура или UITextField событие. Я также искал "событие потерянного фокуса", чтобы скрыть клавиатуру, если где-то за пределами текстового поля был нажат. Единственное близкое и практичное "решение", с которым я столкнулся, - это отключить взаимодействие для других представлений, пока пользователь не закончит редактирование (нажатие done/return на клавиатуре), но тем не менее, чтобы иметь возможность прыгать между текстовыми полями, чтобы вносить исправления без необходимости скольжения и на клавиатуре каждый раз.

следующий фрагмент может быть полезен кому-то, кто хочет сделать то же самое:

// disable all views but textfields
// assign this action to all textfields in IB for the event "Editing Did Begin"
-(IBAction) lockKeyboard : (id) sender {

    for(UIView *v in [(UIView*)sender superview].subviews)
        if (![v isKindOfClass:[UITextField class]]) v.userInteractionEnabled = NO;
}

// reenable interactions
// assign this action to all textfields in IB for the event "Did End On Exit"
-(IBAction) disMissKeyboard : (id) sender {

    [(UIResponder*)sender resignFirstResponder]; // hide keyboard

    for(UIView *v in [(UIView*)sender superview].subviews)
        v.userInteractionEnabled = YES;
}

возможно, вам придется подкласс UITextField и переопределить resignFirstResponder. resignFirstResponder будет вызываться так же, как текстовое поле теряет фокус.


Я думаю, что вы реализовали UIKeyboardDidHideNotification и в этом случае вы

использовать код типа

[theTextField resignFirstResponder];

удалить этот код.

также же код пишите в textFieldShouldReturn метод. это также потеряло фокус.


для тех, кто борется с этим в Swift. Мы добавляем распознаватель жестов в представление ViewController, так что при нажатии на представление мы отклоняем текстовое поле. Важно не отменять последующие клики по представлению.

Swift 2.3

    override func viewDidLoad() {
        //.....

        let viewTapGestureRec = UITapGestureRecognizer(target: self, action: #selector(handleViewTap(_:)))
        //this line is important
        viewTapGestureRec.cancelsTouchesInView = false
        self.view.addGestureRecognizer(viewTapGestureRec)

         //.....
    }

    func handleViewTap(recognizer: UIGestureRecognizer) {
        myTextField.resignFirstResponder()
    }