UITextField теряет фокусное событие
У меня есть UITextField в классе MyCustomUIView, и когда UITextField теряет фокус, я хотел бы скрыть поле и показать что-то еще на месте.
Делегат для UITextField
установлен на MyCustomUIView
через IB, и у меня также есть события "End End" и "Editing Did End", указывающие на метод IBAction
в MyCustomUIView
.
@interface MyCustomUIView : UIView {
IBOutlet UITextField *myTextField;
}
-(IBAction)textFieldLostFocus:(UITextField *)textField;
@end
Однако ни одно из этих событий не срабатывает, когда UITextField теряет фокус. Как вы ловушки/ищете это событие?
Делегат для UITextField
устанавливается как MyCustomUIView
, поэтому я получаю сообщение textFieldShouldReturn
, чтобы закрыть клавиатуру, когда закончите.
Но меня тоже интересует, когда пользователь нажимает какую-либо другую область на экране (скажем, другой элемент управления или просто пустую область), и текстовое поле потеряло фокус.
Ответы
Ответ 1
Я считаю, что вам нужно назначить ваше представление как делегат UITextField следующим образом:
@interface MyCustomUIView : UIView <UITextFieldDelegate> {
В качестве дополнительного бонуса вы можете убрать клавиатуру, когда нажимаете кнопки "done" или "return", в зависимости от того, как вы установили это свойство:
- (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;
}
Ответ 2
Попробуйте использовать делегат для следующего метода:
- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"Lost Focus for content: %@", textField.text);
return YES;
}
Это сработало для меня.
Ответ 3
Проблема с решением resignFirstResponder заключается в том, что он может быть вызван только явной клавиатурой или событием 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;
}
Ответ 4
Возможно, вам придется подклассифицировать UITextField
и переопределить resignFirstResponder
. resignFirstResponder
будет вызываться так же, как текстовое поле теряет фокус.
Ответ 5
Я думаю, что вы внедрили UIKeyboardDidHideNotification
, и в этом случае вы
используйте код, например
[theTextField resignFirstResponder];
удалите этот код.
также тот же код записывается в textFieldShouldReturn
. это также потеряло фокус.
Ответ 6
Для тех, кто борется с этим в Свифт. Мы добавляем распознаватель жестов в представление ViewController, чтобы при прослушивании view мы отклоняли текстовое поле. Важно не отменять последующие клики в представлении.
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()
}