2012-01-22 15 views
13

È possibile ottenere UITextField o UITextView attualmente attivi in ​​un UIView, in modo da poter nascondere la tastiera con [text resignFirstResponder];?Come ottenere UITextField/UITextView attualmente attivi e resignFirstResponder?

+0

possibile duplicato di [Come determinare il UITextField attualmente selezionato?] (http://stackoverflow.com/questions/8956704/how-can-i-determine-the-uitextfield-currently-selected) –

risposta

27

Come di iOS 2.0 e più tardi, c'è un modo semplice per chiudere la tastiera senza hav per rintracciare il controllo attualmente attivo, o scorrere tra tutti i controlli disponibili, oppure usare un UITextFieldDelegate.

[self.view endEditing:YES] 

Dalla documentazione:

endEditing:

Provoca la vista (o uno dei suoi campi di testo incorporati) per dimissioni del primo stato di responder.

- (BOOL) endEditing :(BOOL) vigore

Parametri
vigore
Specificare YES per costringere il primo soccorritore di dimettersi, indipendentemente dal fatto che vuole fare così.

Return Value
YES se la vista è dimesso il primo stato di responder o NO se non lo ha fatto.

Discussione
Questo metodo guarda alla vista corrente e della sua gerarchia visualizzazione secondaria per il campo di testo che è attualmente il primo responder. Se ne trova uno, chiede che il campo di testo si dimettiti come primo risponditore. Se il parametro force è impostato su YES, il campo di testo non viene mai nemmeno richiesto; è costretto a dimettersi.

0

È possibile seguire se si desidera specificamente recuperare il campo di testo del risponditore. Get the current first responder without using a private API

è anche possibile utilizzare il codice seguente se desideri solo respingere campo di testo attivo tastiera-

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [textField resignFirstResponder]; 
    return YES; 
} 
+0

Dove devo inserire questo codice? – Tyilo

+0

E questo non funzionerebbe con UITextView, vero? – Tyilo

+0

fare riferimento per la visualizzazione del testo- http://stackoverflow.com/questions/703754/how-to-dismiss-keyboard-for-uitextview-with-return-key – rishi

5

Non v'è alcun modo per ottenere direttamente ciò oggetto è l'attuale primo soccorritore (che io sappia, almeno) senza testarli singolarmente. Che cosa si può fare è quello di creare un metodo che contiene tutte le subviews che, concettualmente, potrebbe essere il primo risponditore attivo, come segue:

- (void)dismissKeyboard { 
    if (myTextField1.isFirstResponder) { 
     [myTextField1 resignFirstResponder]; 
    } 
    else if (myTextField2.isFirstResponder) { 
     [myTextField2 resignFirstResponder]; 
    } 
    else if (myTextField3.isFirstResponder) { 
     [myTextField3 resignFirstResponder]; 
    } 
    else if (myTextField4.isFirstResponder) { 
     [myTextField4 resignFirstResponder]; 
    } 
} 

In realtà, però, tendo a farlo in questo modo, senza prima verificare se una particolare UIView è l'attuale primo soccorritore, e non credo che ci sia alcun successo apprezzabile prestazioni/problema (che ho notato in ogni caso):

- (void)dismissKeyboard { 
    //Send resignFirstResponder message to all possible first responders... 
    [myTextField1 resignFirstResponder]; 
    [myTextField2 resignFirstResponder]; 
    [myTextField3 resignFirstResponder]; 
    [myTextField4 resignFirstResponder]; 
} 

Speranza che aiuta ...

+2

Questo non è necessario, [self.view endEditing: YES] ; andrà bene –

5

Questo codice swift funziona nel trovare il primo soccorritore:

func findActiveResponderFrame(view:UIView)->UIView?{ 
    if view.isFirstResponder() { 
    return view 
    } else { 
    for sub in view.subviews { 
     if let subView = sub as? UIView, 
      found = findActiveResponderFrame(subView){ 
     return found 
     } 
    } 
    } 
    return nil 
} 
0

Aggiornamento per Swift 3

Questa funzione nasconde la tastiera di qualsiasi campo di testo attivo a Swift 3:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.view.endEditing(true) 
} 
Problemi correlati