scrittura - Mantieni visibile la barra degli strumenti allineata alla tastiera di iPhone tramite la modifica del primo soccorritore?




tastiera iphone non funziona (2)

Sto usando il metodo descritto da Josh in questa domanda per aggiungere una barra degli strumenti alla parte superiore della tastiera dell'iPhone. Fondamentalmente, l'idea è:

  • Aggiungi il controller di visualizzazione come osservatore per le notifiche UIKeyboardWillShowNotification e UIKeyboardWillHideNotification nel suo metodo di inizializzazione
  • Ogni volta che tali notifiche vengono pubblicate, attiva / disattiva una barra degli strumenti sullo schermo insieme alla tastiera

Ho anche più UITextField sullo schermo, che diventano tutti i primi risponditori quando vengono selezionati per la modifica e le dimissioni del primo risponditore quando la modifica è completa (l'utente tocca un altro campo di testo, non ha campo di testo, o preme "Fatto" sulla tastiera - Ho textFieldShouldReturn: sovrascritto per resignFirstResponder ).

Sto avendo un problema, però, dal momento che le notifiche vengono pubblicate ogni volta che passo tra i campi di testo. Ad esempio, se un utente sta modificando il campo di testo A, quindi finisce con esso e tocca il campo di testo B, A si dimette primo risponditore e B diventa primo soccorritore. Tuttavia, questo pubblica anche le notifiche "mostrerà" e "nasconderò" al mio controller di visualizzazione.

Il risultato finale di tutto questo è che mentre la barra degli strumenti viene visualizzata con la tastiera per il primo campo di testo e scompare con la tastiera per l'ultimo campo di testo, sembra scorrere all'interno e all'esterno della tastiera ogni volta che l'utente passa da un testo all'altro campi.

C'è un modo per rispondere solo alle notifiche "will {show, hide}" se la tastiera verrà effettivamente mostrata o nascosta? In altre parole, come posso ignorare le notifiche che non determineranno un cambiamento nello stato visibile della tastiera?


È necessario creare un BOOL ivar per tenere traccia della presenza o meno della tastiera, quindi farai buon uso di tutti i metodi delegati di UITextField :) Le barre degli strumenti con più campi di testo possono essere complicati, ma tu sei molto vicino!


Per dare seguito alla risposta di Reed: mi sono ritrovato a utilizzare la seguente implementazione. Usa un BOOL per tracciare se il controller si trova tra un textFieldShouldBeginEditing: e textFieldDidBeginEditing: message, così come un ivar per tracciare il campo di testo attualmente in fase di modifica.

L'implementazione presuppone che l'interfaccia abbia il seguente, con proprietà appropriate e marker @synthesize . MyKeyboardToolbar è una sottoclasse di UIToolbar con un inizializzatore personalizzato per creare i propri pulsanti.

BOOL shouldBeginEditing;
UITextField *editingField;
MyKeyboardToolbar *keyboardBar;

E il codice stesso:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    // Give up first responder so the keyboard goes away
    [textField resignFirstResponder];

    return YES;
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    self.shouldBeginEditing = YES;
    return YES;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    self.shouldBeginEditing = NO;
    self.editingField = textField;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    // Do things here with the edited data (e.g. save it somewhere)

    return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    self.editingField = nil;
}

// These methods are added as the observers to the notification center
- (void)keyboardWillShow:(NSNotification *)notification {
    if(self.keyboardBar == nil) {
        // Create and show the keyboard toolbar
    }
}

- (void)keyboardWillHide:(NSNotification *)notification {
    if(![self shouldBeginEditing]) {
        // Animate the bar off the screen, if necessary

        // Remove and dispense of the bar entirely
        [self.keyboardBar removeFromSuperview];
        self.keyboardBar = nil;
    }
}

// This method's selector is given to the keyboard toolbar's Done button
- (void)didPressKeyboardBarDoneButton {
    [self.editingField resignFirstResponder];
}