Ich erstelle eine sehr einfache Beispielanwendung, um zu zeigen, wie die Einstellungen mit einer neuen Anwendung, an der ich arbeite, funktionieren werden. Der Prozess ist sehr einfach: Erstellen Sie einen UINavigationController in IB, weisen Sie ihm den View-Controller zu, der der Root-View-Controller sein wird, und schieben Sie einen neuen View-Controller auf den Stapel des Navigations-Controllers, wenn didSelectRowAtIndexPath aufgerufen wird.
Ich habe so viele verwandte Themen zu diesem Thema gelesen, wie ich finden konnte, und nie eine zufriedenstellende Antwort gefunden.
Das Problem ist, dass, wenn die Zurück-Taste gedrückt wird, die Navigation Controller animiert zurück, aber die Ansicht selbst nicht zurück zu ändern, was bedeutet, dass es nicht gepoppt wird.
Dies ist der Code, den ich verwende, um den neuen View Controller auf den Stapel zu schieben. Es ist ziemlich Standard. Ich fügte die NSLog um sicherzustellen, dass es nur einmal getroffen wird.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.section != 0)
return;
NSLog(@"didSelectRowAtIndexPath\n");
PrefsListTableViewController *prefsListTableViewController = [[PrefsListTableViewController alloc] initWithNibName:@"PrefsListTableViewController" bundle:nil];
[self.navigationController pushViewController:prefsListTableViewController animated:YES];
[prefsListTableViewController release];
}
Um zu überprüfen, ob der viewWillDisappear-Aufruf auf der zweiten Ansicht getroffen wird, habe ich dies zu meinem PrefsListTableViewController hinzugefügt:
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
NSLog(@"ptvc viewWillDisappear");
}
Diese wird nie getroffen.
Erstens hatte ich den Eindruck, dass Sie nichts codieren müssen, um die Schaltfläche "Zurück" zu behandeln, da der UINavigationController den Stapel automatisch für Sie öffnen sollte, wenn Sie die Schaltfläche "Zurück" drücken. Ich kann zeigen, dass mit einer Beispielanwendung, die ich habe, die tut, was ich tue, aber das Beispiel ist nur Code. Der Code stammt aus dem iPhone Developer's Cookbook von Erica Sadun, Rezept 11-11. Ihr Code ist hier zu finden:
https://github.com/erica/iphone-3.0-cookbook-/tree/master/C11-Tables/11-Disclosure%20Chevrons
Wenn Sie sich ihren Code ansehen, gibt es keine .xib-Dateien, und alles wird gehandhabt, ohne dass die Schaltfläche "Zurück" überhaupt codiert werden muss. Die View-Controller werden in den Code geschoben und scheinbar ohne Code gepoppt. Ich ziehe es vor, .xib-Dateien zu verwenden, und alles MUSS auf die gleiche Weise funktionieren, aber das tut es nicht.
Zweitens habe ich NSLog-Anweisungen eingefügt, um zu zeigen, dass der Root-Navigationscontroller tatsächlich die beiden Viewcontroller hat.
2011-11-18 11:14:36.355 TableViewTest[58011:207] didSelectRowAtIndexPath
2011-11-18 11:14:36.358 TableViewTest[58011:207] ptvc viewWillAppear (
"<TableViewController: 0x8923d40>",
"<PrefsListTableViewController: 0x8927a20>"
)
2011-11-18 11:14:36.717 TableViewTest[58011:207] ptvc viewDidAppear (
"<TableViewController: 0x8923d40>",
"<PrefsListTableViewController: 0x8927a20>"
)
Sie können also sehen, dass die View-Controller in der richtigen Reihenfolge verschoben werden.
Das führt zu einer Frage: Warum wird PrefsListTableViewController nicht gepoppt, wenn die Zurück-Taste gedrückt wird? Wenn jemand mehr Informationen benötigt, lassen Sie es mich bitte wissen.