我正在创建一个非常简单的示例应用程序,以显示首选项如何与我正在开发的新应用程序一起工作。该过程非常简单:在IB中创建一个UINavigationController,将其分配给将成为根视图控制器的视图控制器,并在调用didSelectRowAtIndexPath时将一个新的视图控制器推送到导航控制器的堆栈中。
我已经阅读了尽可能多的与此相关的主题,但从未找到满意的答案。
问题是,当按下back按钮时,导航控制器会向后显示动画,但视图本身不会变回,这意味着它不会弹出。
这是我用来把新的视图控制器推到堆栈上的代码。这是相当标准的。我添加了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 Developer's Cookbook code,recipe 11-11。她的代码如下:
https://github.com/erica/iphone-3.0-cookbook-/tree/master/C11-Tables/11-Disclosure%20Chevrons
如果您查看她的代码,就会发现没有.xib文件,而且所有操作都无需编写back按钮。视图控制器是在代码中推送的,并在没有代码的情况下弹出。我更喜欢使用.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没有弹出?如果有人需要更多的信息,请让我知道。
发布于 2013-02-28 11:06:58
你扩展UINavigationController类了吗?我做了,也遇到了同样的问题。显然,根据苹果文档,你不应该扩展那个类...
https://stackoverflow.com/questions/8185841
复制相似问题