Domanda

Sono sicuro che questo è nella documentazione Apple o deve essere stato risposto da qualche parte su questo forum, dal momento che sembra così semplice, ma non riuscivo a trovare né una soluzione particolarmente elegante me stesso.

Quello che ho è un UIViewController che spinge una vista di modifica sul suo stack di spostamento. La vista modifica ha un mucchio di UITextFields in esso. Se uno di loro si sta modificando, quando il pulsante indietro viene toccato, il metodo viewWillAppear della vista originale si chiama Prima che i metodi UITextField delegato di textFieldShouldEndEditing o textFieldDidEndEditing, oppure il metodo di IB legata textFieldEditingEnded azione sono chiamati.

Ecco un codice che spero possa renderlo più chiaro:

Nel UIViewController:

- (void) viewWillAppear: (BOOL) animated {
    [super viewWillAppear: animated];
    NSLog( @"Entering view will appear for master view" );
    nameLabelField.text = objectToEdit.name;
}
- (IBAction) editMyObject: (id) sender {
    NSLog( @"Editing the object" );
    EditViewController *evc = [[EditViewController alloc] initWithNibName: @"EditTableView" bundle: nil];
    evc.editedObject = objectToEdit;
    [self.navigationController pushViewController: evc animated: YES];
    [evc release];
}

Nel EditViewController :

- (void) viewWillAppear: (BOOL) animated {
    [super viewWillAppear: animated];
    nameField.text = editedObject.name;
}
- (void) viewWillDisappear: (BOOL) animated {
    [super viewWillDisappear: animated];
    NSLog( @"In viewWillDisappear" );
    if( [self.navigationController.viewControllers indexOfObject: self] == NSNotFound ) {
        NSLog( @"-- We are not in controller stack... the back button has been pushed" );
    }
}
- (BOOL) textFieldShouldEndEditing: (UITextField *) textField {
    NSLog( @"In textFieldShouldEndEditing" );
    // Store text field value here???
    // editedObject.name = nameField.text;
    return YES;
}
- (void) textFieldDidEndEditing: (UITextField *) textField {
    NSLog( @"In textFieldDidEndEditing" );
    // Store text field value here???
    // editedObject.name = nameField.text;
}
- (IBAction) textFieldEditingEnded: (id) sender {
    NSLog( @"In textFieldEditingEnded" );
    // Store text field value here???
    // editedObject.name = nameField.text;
}

Il registro si conclude con:

  

[...] Entrare vista appare per maestro vista
  [...] Modifica l'oggetto
  [...] In viewWillDisappear
  [...] - Non siamo in pila di controllo ... il pulsante Indietro è stato spinto
  [...] Entrare vista appare per maestro vista
  [...] In textFieldShouldEndEditing
  [...] In textFieldEditingEnded
  [...] In textFieldDidEndEditing

Voglio self.editedObject.name = nameField.text set prima dell'etichetta viene impostata nel viewWillAppear per l'UIViewController.

ho pensato nel metodo viewWillDisappear per l'EditViewController controllo per vedere se qualcuno dei miei campi di testo sono attualmente il primo soccorritore e se in modo da ottenere il loro testo e la memorizzazione, ma questo mi sembra un tale kludge che sarà un dolore per mantenere se aggiungere o modificare campi di testo.

I può anche attuare il textFieldEditingChanged IB legata azione per impostare il testo nell'oggetto modificato dopo ogni battitura, ma questo è anche un po 'di spese generali dal momento che ho di capire quale campo di testo sono in ogni battitura (ricordo che solo ha mostrato name ma ci sono un sacco di loro).

Tutto quello che serve è per l'editing per essere terminata o di conoscere l'editing verrà terminata prima viewWillAppear viene chiamato nel UIViewController in modo che il nameFieldLabel è impostato correttamente.

È stato utile?

Soluzione

OK, ho capito una soluzione semplice dopo un sacco di web-surfing, la lettura forum, e la lettura manuale. E 'stato, come sospettavo, molto semplice, una sola riga di codice aggiunto. Nel metodo viewWillDisappear del EditViewContorller ho aggiunto semplicemente:

    [self.view.window endEditing: YES];

Ora textFieldShouldEndEditing, textFieldEditingEnded e textFieldDidEndEditing tutte licenziato fuori prima della viewWillAppear della vista maestro fa.

Così ora il metodo viewWillDisappear assomiglia:

- (void) viewWillDisappear: (BOOL) animated {
    [super viewWillDisappear: animated];
    NSLog( @"In viewWillDisappear" );
    // Force any text fields that might be being edited to end so the text is stored
    [self.view.window endEditing: YES];
}

E i metodi già in atto per gestire il 'ritorno' sulla tastiera anche di gestire il pulsante 'Indietro' sul controller di navigazione.

Grazie Aaron e Jeff per la vostra assistenza e aiutare me che questo attraverso.

Altri suggerimenti

Perché non solo creare il proprio pulsante Indietro con quella logica nel suo metodo di azione?

Vorrei pensare che dal punto di vista UX, si dovrebbe visualizzare un avviso per determinare se l'utente vuole annullare l'azione di modifica che erano nel bel mezzo della prima di uscire dalla visualizzazione corrente.

Per avvertire l'utente, si può vedere se colpiscono il pulsante per caso o se hanno fatto decidono di lasciare la vista, intraprendere l'azione appropriata.

// add this to the field(s) to be edited, selector will be called as the changes
// are being made... still difficult to handle a cancel, but should work
[objectToEdit addTarget:self action:@selector(updateNameField:) 
                         forControlEvents:UIControlEventEditingChanged];

codice aggiuntivo qui ...

// the method called to update object from parent view
- (void)updateNameField:(id)sender {
    <OBJECT TO UPDATE>.text = ((UITextField *)sender).text;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top