Я создаю очень простой пример приложения, чтобы показать, как настройки будут работать с новым приложением, над которым я работаю. Процесс очень прост: создайте UINavigationController в IB, назначьте ему View Controller, который будет корневым контроллером представления, и вставьте новый контроллер представления в стек контроллера навигации при вызове didSelectRowAtIndexPath.
Я прочитал столько связанных с этим тем, сколько смог найти, и так и не нашел удовлетворительного ответа.
Проблема в том, что когда нажата кнопка «Назад», навигационный контроллер анимирует назад, но само представление не изменяется назад, то есть оно не появляется.
Это код, который я использую, чтобы поместить новый контроллер представления в стек. Это довольно стандартно. Я добавил NSLog, чтобы убедиться, что его ударили только один раз.
- (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];
}
Чтобы проверить, выполняется ли вызов viewWillDisappear во втором представлении, я добавил это в свой PrefsListTableViewController:
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
NSLog(@"ptvc viewWillDisappear");
}
Это никогда не получит удар.
Во-первых, у меня сложилось впечатление, что вам не нужно ничего кодировать для обработки кнопки «назад», поскольку UINavigationController должен автоматически выталкивать для вас стек, когда вы нажимаете кнопку «назад». Я могу показать, что у меня есть пример приложения, которое делает то, что я делаю, но пример только код. Код взят из кода поваренной книги Эрика Садуна для разработчиков iPhone, рецепт 11-11. Ее код здесь:
https://github.com/erica/iphone-3.0-cookbook-/tree/master/C11-Tables/11-Disclosure%20Chevrons
Если вы посмотрите на ее код, там нет файлов .xib, и все обрабатывается без необходимости вообще кодировать кнопку возврата. Контроллеры представления помещаются в код и выталкиваются, по-видимому, без кода. Я предпочитаю использовать файлы .xib, и все ДОЛЖНО работать так же, но это не так.
Во-вторых, я вставил операторы NSLog, чтобы показать, что на самом деле корневой контроллер навигации имеет два контроллера представления.
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>"
)
Таким образом, вы можете видеть, что контроллеры представления помещены в правильном порядке.
Это приводит к одному вопросу: почему PrefsListTableViewController не появляется при нажатии кнопки «Назад»? Если кому-то нужна дополнительная информация, пожалуйста, дайте мне знать.