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.

È stato utile?

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()
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top