2009-07-15 6 views
17

Ho un UITextField in una classe MyCustomUIView e quando UITextField perde lo stato attivo, vorrei nascondere il campo e mostrare qualcos'altro sul posto.UITextField perde l'evento di messa a fuoco

Il delegato per la UITextField è impostato su MyCustomUIView via IB e ho anche 'è finita On Exit' e 'Editing è finita' gli eventi che indica un metodo IBAction all'interno MyCustomUIView.

@interface MyCustomUIView : UIView { 

IBOutlet UITextField *myTextField; 

} 

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

@end 

Tuttavia, nessuno di questi eventi sembra essere attivato quando UITextField perde lo stato attivo. Come intrappoli/cerchi questo evento?

Il delegato per il UITextField è impostato come MyCustomUIView così sto ricevendo il messaggio textFieldShouldReturn per chiudere la tastiera una volta terminato.

Ma ciò a cui sono interessato è capire quando l'utente preme un'altra area sullo schermo (ad esempio un altro controllo o solo un'area vuota) e il campo di testo ha perso la messa a fuoco.

risposta

11

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; 
} 
2

potrebbe essere necessario creare una sottoclasse del UITextField e sovrascrivere resignFirstResponder. resignFirstResponder verrà chiamato proprio come il campo di testo perde lo stato attivo.

4

Il problema con la soluzione resignFirstResponder solo è, che può essere attivata solo da un esplicito tastiera o UITextField evento. Stavo anche cercando un "evento di messa a fuoco persa" per nascondere la tastiera, se fosse stato toccato da qualche parte al di fuori del campo di testo. L'unica soluzione vicina e pratica che ho trovato è quella di disabilitare le interazioni per altre viste fino a quando l'utente non ha finito con il montaggio (colpire finito/ritorno sulla tastiera) ma comunque essere in grado di saltare tra i campi di testo per apportare correzioni senza la necessità di scorrere fuori e nella tastiera ogni volta.

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; 
} 
26

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.

1

Penso che è stato implementato UIKeyboardDidHideNotification e in questo caso in cui si

utilizzare il codice come

[theTextField resignFirstResponder]; 

rimuovere questo codice.

stesso codice di scrittura nel metodo textFieldShouldReturn. anche questo ha perso la concentrazione.

0

Per coloro che hanno problemi con questo in Swift. Aggiungiamo un riconoscitore di gesti alla vista del ViewController in modo che quando la vista viene toccata, ignoriamo il campo di testo. È importante non annullare i clic 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() 
    }