【发布时间】:2012-01-01 10:03:17
【问题描述】:
我正在创建一个非常简单的示例应用程序,以展示首选项如何与我正在开发的新应用程序一起使用。过程非常简单:在 IB 中创建一个 UINavigationController,为其分配将成为根视图控制器的视图控制器,并在调用 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 Developer's Cookbook 代码,配方 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 没有弹出?如果有人需要更多信息,请告诉我。
【问题讨论】:
-
我建议使用 xCode 模板,或者从 iOS 开发者中心的示例代码开始。您链接的代码非常过时 - 显然是针对 3.0 的,但正在使用诸如 applicationDidFinishLaunching: 之类的方法。文档说“在 iOS 3.0 及更高版本中,您应该使用 application:didFinishLaunchingWithOptions: 代替。developer.apple.com/library/ios/#documentation/uikit/reference/…
-
Jacob,我相信您正在查看 Erica 的示例,而不是我的代码。我们的目标是 iOS 4.2。示例代码表明无需处理后退按钮。
-
当您点击返回按钮时,会在 UINavigationBar 上调用 popNavigationItemAnimated:(BOOL)animated,而后者又会在导航控制器上调用 popViewControllerAnimated。该行为似乎表明第二次调用不成功。 UINavigationController 上是否有任何子类或类别可能会拦截 popViewControllerAnimated 调用?
-
雅各布,无。 UINavigationController 按原样放置到 MainWindow.xib 中,因此完全完成了子类化。
-
我想通了。代表有一个称为“代表”的引用出口,它与两个出口相连。它应该只是链接到“文件的所有者”。固定。
标签: iphone uinavigationcontroller