Вопрос

У меня есть 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 сообщение об отключении клавиатуры после завершения.

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

Это было полезно?

Решение

Я считаю, что вам нужно обозначить свое представление как делегат 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;
}

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

Проблема с уйти в отставкуFirstResponder Решение состоит лишь в том, что оно может быть вызвано только явным клавиатура или UITextField событие.Я также искал «событие потери фокуса», чтобы скрыть клавиатуру, если где-то за пределами текстового поля было нажато.Единственное близкое и практичное «решение», с которым я столкнулся, — это отключить взаимодействие для других представлений до тех пор, пока пользователь не завершит редактирование (нажатие «Готово»/возврат на клавиатуре), но при этом иметь возможность переключаться между текстовыми полями, чтобы вносить исправления без необходимость каждый раз выдвигать и вставлять клавиатуру.

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

// 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, чтобы при касании представления мы закрывали текстовое поле.Важно не отменять последующие клики по просмотру.

Свифт 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()
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top