UITextField perdere la messa a fuoco evento
-
16-09-2019 - |
Domanda
Ho un UITextField in una classe MyCustomUIView e quando l'UITextField perde attenzione, mi piacerebbe nascondere il campo e mostrare qualcosa di diverso al suo posto.
Il delegato per la UITextField
è impostato su MyCustomUIView
via IB e ho anche 'è finita On Exit' e 'Editing è finita' gli eventi che punta a un metodo IBAction
all'interno MyCustomUIView
.
@interface MyCustomUIView : UIView {
IBOutlet UITextField *myTextField;
}
-(IBAction)textFieldLostFocus:(UITextField *)textField;
@end
Tuttavia, nessuno di questi eventi sembrano essere licenziato quando l'UITextField perde lo stato attivo. Come si fa a trappola / guarda per questo evento?
Il delegato per la UITextField
è impostato come MyCustomUIView
così sto ricevendo un messaggio textFieldShouldReturn
per nascondere la tastiera quando fatto.
Ma quello che mi interessa è capire quando l'utente preme qualche altra area dello schermo anche (diciamo un altro controllo o solo un'area vuota) e il campo di testo ha perso la messa a fuoco.
Soluzione
Credo che hai bisogno di designare la vostra vista come un delegato UITextField in questo modo:
@interface MyCustomUIView : UIView <UITextFieldDelegate> {
Come bonus aggiuntivo, in questo modo si ottiene la tastiera per andare via quando si preme il "fatto" o di ritorno pulsanti, a seconda di come è stata impostata la proprietà:
- (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;
}
Altri suggerimenti
Provare a utilizzare delegato per il metodo seguente:
- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"Lost Focus for content: %@", textField.text);
return YES;
}
Che ha lavorato per me.
Il problema con il soluzione resignFirstResponder solo è, che può essere attivata solo da un esplicito Tastiera o UITextField evento. Sono stato anche alla ricerca di un "evento attenzione perduto" per nascondere la tastiera, se da qualche parte al di fuori del campo di testo è stato premuto su. L'unica "soluzione" stretta e pratica mi sono imbattuto è, per disabilitare le interazioni di altri punti di vista fino a quando l'utente ha terminato con la redazione (che colpisce fatto / ritorno sulla tastiera), ma ancora di essere in grado di saltare tra i campi di testo per fare correzioni senza la necessità di scivolare fuori e in ogni tastiera.
Il seguente frammento forse utile a qualcuno, che vuole fare la stessa cosa:
// 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;
}
Potrebbe essere necessario sottoclasse il UITextField
e sovrascrivere resignFirstResponder
. resignFirstResponder
sarà chiamato proprio come il campo di testo è perdere la concentrazione.
Credo che bisogna implementato UIKeyboardDidHideNotification
e in questo caso in cui si
utilizzare il codice come
[theTextField resignFirstResponder];
rimuovere questo codice.
anche lo stesso codice di scrittura nel metodo textFieldShouldReturn
. Questa attenzione anche perso.
Per coloro che lottano con questo in Swift. Aggiungiamo un sistema di riconoscimento gesto alla visualizzazione del ViewController in modo che quando la vista è sfruttato abbiamo respingere il campo di testo. E 'importante non cancellare gli scatti successivi sulla vista.
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()
}