2012-08-12 12 views
6

Sto cercando di sbarazzarsi della tastiera quando l'utente touch fuori dalla mia UITextField, utilizzando questo metodo:resignFirstResponder intesa con UITextField

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [mainTextController resignFirstResponder]; 
    [super touchesBegan:touches withEvent:event]; 
} 

Tuttavia, questo sembra chiamare un metodo che viene chiamato dopo aver premuto il pulsante di ritorno sulla tastiera, ma voglio solo che la tastiera svanisca, non premere il tasto di ritorno per me. Come posso farlo?

Grazie!

MODIFICA: la risposta di gilani è la più diretta, funziona come un incantesimo, senza passare a UIControl. Ma credo che la risposta di jonkroll funzioni anche.

risposta

13

provare

[self.view endEditing:YES]; 

Aggiornamento:

assumere un valore booleano e impostarlo a false nel metodo init. Nel metodo metodo textFieldShouldReturn delegato, eseguire il codice se è falso, altrimenti salta

- (BOOL) textFieldShouldReturn:(UITextField*)textField 
{ 
    if (!boolean) 
    { 
     // YOur code logic here 
    } 
    boolean = false; 
} 

nel metodo in cui si chiama il metodo endEditing, impostare booleano true.

boolean = YES;  
[self.view endEditing:YES]; 
8

Ecco come ho gestito questo prima. In primo luogo creare un metodo sul controller della vista che respingere la tastiera dimettendosi primo stato responder sul campo di testo:

- (IBAction)dismissKeyboard:(id)sender 
{ 
    [mainTextController resignFirstResponder]; 
} 

Avanti, nella scena storyboard per il vostro ViewController (o nib, se non si sta utilizzando gli storyboard) cambia la classe della proprietà view di ViewController da UIView a UIControl. La proprietà view è effettivamente lo sfondo dietro gli altri elementi dell'interfaccia utente. Il tipo di classe deve essere modificato perché UIView non può rispondere agli eventi di tocco, ma UIControl (che è una sottoclasse diretta di UIView) può rispondere ad essi.

Infine, nel metodo di vostra ViewController viewDidLoad:, informi il controller della vista per eseguire il metodo dismissKeyboard quando la vista riceve un evento UIControlEventTouchDown.

- (void)viewDidLoad 
{ 
    [super viewDidLoad];  
    UIControl *viewControl = (UIControl*)self.view; 
    [viewControl addTarget:self action:@selector(dismissKeyboard:) forControlEvents:UIControlEventTouchDown]; 
} 

EDIT:

Parte della vostra preoccupazione sembra essere che textFieldDidEndEditing: è chiamata quando la tastiera è respinto. Ciò è inevitabile, verrà sempre chiamato ogni volta che un campo di testo perde il focus (cioè lo stato di primo soccorritore). Sembra che il tuo problema è che hai messo il codice da eseguire quando l'utente fa clic sul pulsante di ritorno in textFieldDidEndEditing:. Se non si desidera che il codice venga eseguito quando l'utente tocca al di fuori del campo di testo, non è il posto giusto per inserirlo.

Invece, vorrei mettere quel codice in un metodo separato:

- (IBAction)textFieldReturn:(id)sender 
{ 
    if ([mainTextController isFirstResponder]) { 
      [mainTextController resignFirstResponder]; 

      // put code to run after return key pressed here... 
     } 
    } 
} 

e quindi chiamare quel metodo tramite Obiettivo-Azione quando il campo di testo invia l'evento di controllo UIControlEventEditingDidEndOnExit.

[mainTextController addTarget:self action:@selector(textFieldReturn:) forControlEvents:UIControlEventEditingDidEndOnExit]; 

noti che UIControlEventEditingDidEndOnExit è diverso UIControlEventEditingDidEnd. Il primo viene chiamato quando il montaggio termina con l'utente che tocca il controllo, quest'ultimo viene chiamato quando la modifica termina premendo il tasto Invio.

+0

E alla fine chiamare resignFirstResponder, che chiama il metodo che viene chiamato dopo aver premuto il pulsante di ritorno (credo textFieldDidEndEditing) –

+0

Così mi sono confuso - stai dicendo di voler annullare la tastiera, ma avere il vostro campo di testo mantenere first responder stato? Se è così, non è possibile. Sei corretto, textFieldDidEndEditing verrà chiamato indipendentemente da quando la tastiera viene chiusa e il campo di testo perde lo stato attivo. Invece di inserire la logica del pulsante di ritorno, esaminare l'utilizzo dell'azione di destinazione per l'evento di controllo UIControlEventEditingDidEndOnExit. In questo modo puoi distinguere tra l'utente che preme il pulsante di ritorno sulla tastiera mentre modifica il campo di testo e l'utente che lascia il campo di testo facendo clic in un'altra posizione. – jonkroll

+0

Non ti ho capito appieno. Puoi modificare la tua risposta per mostrare cosa intendevi? Grazie –

0

è necessario modificare la visualizzazione di proprietà da UIViewViewController's-UIControl utilizzando Impostazioni Identità:

Da lì, è sufficiente creare un IBAction e dire il campo di testo di licenziare (che io parto dal presupposto è la vostra mainTextController). Se mainTextController non è il campo di testo su cui si desidera ignorare la tastiera, modificare il metodo resignFirstReaponder nel proprio campo di testo in questo modo.

- (IBAction)backgroundTap:(id)sender { 
[myTextField resignFirstResponder]; 
} 

poi da lì tornare nel proprio file Vedi di Contoller .xib e collegare l'azione per il controllo Visualizza e selezionare "Touch Down".