UITextField Fokus Ereignis verlieren
-
16-09-2019 - |
Frage
Ich habe eine UITextField in einer MyCustomUIView Klasse und wenn die UITextField Fokus verliert, würde Ich mag das Feld verstecken und etwas anderes an Ort und Stelle zeigen.
Der Beauftragte für den UITextField
gesetzt wird über IB MyCustomUIView
und ich habe auch 'Did On Exit Beenden' und 'Bearbeiten von End Did' Ereignissen an eine IBAction
Methode innerhalb MyCustomUIView
zeigen.
@interface MyCustomUIView : UIView {
IBOutlet UITextField *myTextField;
}
-(IBAction)textFieldLostFocus:(UITextField *)textField;
@end
Allerdings scheinen keine dieser Ereignisse ausgelöst werden, wenn die UITextField den Fokus verliert. Wie Sie trap / suchen Sie nach diesem Ereignis?
Der Beauftragte für den UITextField
als MyCustomUIView
so eingestellt, dass ich textFieldShouldReturn
Nachricht erhalten die Tastatur zu schließen, wenn Sie fertig.
Aber was ich interessiere mich auch für herauszufinden, wenn der Benutzer auf dem Bildschirm einen anderen Bereich drückt (sagen wir eine andere Steuerung oder leeren Bereich) und das Textfeld hat den Fokus verloren.
Lösung
Ich glaube, Sie brauchen Ihre Ansicht als UITextField Delegierten zu benennen, etwa so:
@interface MyCustomUIView : UIView <UITextFieldDelegate> {
Als zusätzlichen Bonus, das ist, wie Sie bekommen die Tastatur weg zu gehen, wenn sie die „done“ oder Rückkehr Tasten drücken, je nachdem, wie Sie diese Eigenschaft festgelegt haben:
- (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;
}
Andere Tipps
Versuchen Sie, für das folgende Verfahren unter Verwendung von Delegierten:
- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"Lost Focus for content: %@", textField.text);
return YES;
}
Das funktioniert für mich.
Das Problem mit der ResignFirstResponder Lösung nur darin, dass es nur durch eine explizite ausgelöst werden kann Tastatur oder UITextField Veranstaltung. Ich war auch auf der Suche nach einem „verlorenen Fokus Ereignisse“, um die Tastatur zu verstecken, wenn irgendwo außerhalb des Textfeldes auf wurde angezapft. Die einzige enge und praktische „Lösung“ Ich kam across ist, für andere Ansichten Interaktionen zu deaktivieren, bis der Benutzer mit der Bearbeitung (trifft fertig / Return auf der Tastatur), aber immer noch in der Lage sein zu springen zwischen dem Textteil fertig ist, Korrekturen vorzunehmen, ohne die Notwendigkeit des Gleitens und in der Tastatur jedes Mal.
Das folgende Snippet vielleicht nützlich für jemanden, der das gleiche tun will:
// 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;
}
Sie müssen möglicherweise die UITextField
Unterklasse und resignFirstResponder
außer Kraft setzen. resignFirstResponder
wird ebenso wie das Textfeld den Fokus verliert aufgerufen werden.
Ich glaube, Sie UIKeyboardDidHideNotification
und in diesem Fall implementiert haben Sie
Verwendung Code wie
[theTextField resignFirstResponder];
Mit diesem Code entfernen.
auch denselben Code schreiben in textFieldShouldReturn
Verfahren. dies auch den Fokus verloren.
Für die mit diesem in Swift kämpfen. Wir fügen eine Gestenerkenner der Ansicht des Viewcontroller, so dass, wenn die Ansicht angezapft wir das Textfeld entlassen. Es ist wichtig, die nachfolgenden Klicks im Hinblick auf die nicht gelöscht werden.
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()
}