Frage

Ich bin sicher, das ist in der Dokumentation Apple oder muss irgendwo auf diesem Forum beantwortet, da es so grundlegend scheint, aber ich kann es nicht noch eine besonders elegante Lösung selbst finden.

Was ich habe, ist ein UIViewController, die auf ihrem Navigationsstapel eine Bearbeitungsansicht schiebt. Die Bearbeitung Ansicht hat eine Reihe von UITextFields drin. Wenn einer von ihnen wird die Bearbeitung, wenn die Zurück-Taste berührt wird, die ViewWillAppear Methode ursprünglichen Ansicht vor, entweder die UITextField Delegatmethoden von textFieldShouldEndEditing oder textFieldDidEndEditing genannt wird, oder den IB verknüpfen Aktion textFieldEditingEnded Methode aufgerufen werden.

Hier ist ein Code, dass ich Hoffnung wird es deutlicher:

In den 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];
}

Im 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;
}

Das Protokoll endet mit:

  

[...] Ansicht Eingabe wird für Masteransicht
erscheinen   [...] Bearbeiten des Objektes
  [...] In viewWillDisappear
  [...] - Wir nicht in Controller-Stack sind ... hat die Zurück-Taste gedrückt worden
  [...] wird für Masteransicht
erscheinen Ansicht eingeben   [...] In textFieldShouldEndEditing
  [...] In textFieldEditingEnded
  [...] In textFieldDidEndEditing

Ich möchte Satz self.editedObject.name = nameField.text bevor das Etikett in viewWillAppear für die UIViewController gesetzt wird.

Ich dachte in der viewWillDisappear Methode zur EditViewController zu überprüfen, ob irgendwelche meiner Textfelder sind derzeit der Ersthelfer und wenn ja, ihr Text bekommen und zu speichern, aber diese wie eine solche Flickschusterei scheint, dass ein Schmerz sein wird, pflegen, wenn ich Felder hinzufügen oder Text ändern.

Ich kann auch die textFieldEditingChanged IB Aktion den Text in dem editierten Objekt nach jedem Tastendruck einzustellen verknüpft implementieren, aber das ist auch ziemlich viel Aufwand, da ich zu Figur haben aus dem Textfeld I in jedem Tastendruck bin (ich erinnere mich nur zeigte name aber es gibt eine ganze Reihe von ihnen).

Alles was ich brauche ist für die Bearbeitung beendet werden oder die Bearbeitung zu wissen, wird beendet, bevor viewWillAppear im UIViewController aufgerufen wird, so wird der nameFieldLabel richtig eingestellt ist.

War es hilfreich?

Lösung

OK, dachte ich, eine einfache Lösung nach einer Menge von Web-Surfen aus, Forum Lesen und manueller Lesung. Es war, wie ich vermutete, sehr einfach, nur eine Zeile Code hinzugefügt. Im viewWillDisappear Methode des EditViewContorller ich einfach hinzugefügt:

    [self.view.window endEditing: YES];

Jetzt textFieldShouldEndEditing, textFieldEditingEnded und textFieldDidEndEditing alle bestanden feuerte vor dem viewWillAppear der Masteransicht der Fall ist.

So, jetzt die viewWillDisappear Methode sieht aus wie:

- (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];
}

Und die Methoden, die bereits an Ort und Stelle das ‚Return‘ auf der Tastatur zu handhaben auch die ‚Zurück‘ Taste auf dem Controller Navigation behandeln.

Danke Aaron und Jeff für Ihre Unterstützung und helfen mir diese durch denken.

Andere Tipps

Warum nicht einfach erstellen Sie Ihre eigene Back-Taste mit dieser Logik in seiner Aktionsmethode?

Ich würde denken, dass aus einer UX Perspektive, sollten Sie eine Warnung angezeigt werden, um zu bestimmen, ob der Benutzer die Bearbeitung Aktion abbrechen will sie in der Mitte war, bevor die aktuelle Ansicht zu verlassen.

Mit dem Alarmieren des Benutzers, können Sie sehen, ob sie die Taste zufällig getroffen oder wenn sie die Ansicht haben Sie sich entschieden zu verlassen, nehmen Sie die entsprechende Aktion aus.

// 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];

Zusatzcode hier ...

// the method called to update object from parent view
- (void)updateNameField:(id)sender {
    <OBJECT TO UPDATE>.text = ((UITextField *)sender).text;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top