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.
E alla fine chiamare resignFirstResponder, che chiama il metodo che viene chiamato dopo aver premuto il pulsante di ritorno (credo textFieldDidEndEditing) –
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
Non ti ho capito appieno. Puoi modificare la tua risposta per mostrare cosa intendevi? Grazie –