我正在创建一个非常简单的示例应用,以显示首选项如何与我正在使用的新应用程序一起使用。这个过程非常简单:在IB中创建一个UINavigationController,为它分配一个作为根视图控制器的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会自动弹出堆栈。我可以通过一个示例应用程序来展示我正在做的事情,但样本只是代码。代码来自Erica Sadun的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?如果有人需要更多信息,请告诉我。
答案 0 :(得分:0)
您是否扩展了UINavigationController类?我做了并且遇到了同样的问题。显然,根据苹果文档,你不应该扩展那个类...