【问题标题】:UINavigationController back button problemUINavigationController后退按钮问题
【发布时间】:2010-06-04 07:44:32
【问题描述】:

你好,

我有一个混合 iPhone 应用程序,它有一个 UITabBarController 和 5 个选项卡。每个选项卡都承载一个 UINavigationViewController,它使用一个根控制器初始化,该根控制器是一个承载一个 UIWebView 的 UIViewController。在某个特定链接上,我推送导航控制器上固有的 UITableViewController(显示本地存储的一些数据)并有一个后退按钮。以下是我在 shouldStartLoadWithRequest: 方法中解析 URL 字符串后的代码。

    UINavigationController *navControl = (UINavigationController *)self.parentViewController;
    CartTableViewController *tabView = [[CartTableViewController alloc] init];
    [navControl pushViewController:tabView animated:YES];
    navControl.navigationBar.hidden = NO;
    return YES;

这很好用。解析特定链接并将表格视图推送到导航堆栈上。当我点击后退按钮时(是的,它显示“后退”而不是前一个视图的名称,即“新闻”)我得到另一个表格视图,但这次后退按钮被命名为“新闻”。当我点击它时,我回到我的根控制器。我似乎没有找到两个视图是从哪里推送到根视图上的堆栈的。

谢谢。 扎基

【问题讨论】:

  • 好的,我找到了问题。对于这样的事情,我需要从 shouldStartLoadWithRequest: 返回 NO。抱歉打扰了:$
  • 您应该回答您自己的问题,以防止此问题显示为未回答。另外,我注意到您在上面的代码中存在内存泄漏。你应该在 pushViewController 之后释放 tabView。导航控制器将保留它。

标签: iphone uinavigationcontroller


【解决方案1】:

您的 webView:shouldStartLoadWithRequest:navigationType 实现可能被调用了两次。一种解决方案是,如果实例尚未在 UINavigationController 堆栈中,则仅创建和推送 CartTableViewController 的实例。

if (![navControl.topViewController isKindOfClass:[CartTableViewController class]]) {
    CartTableViewController *tabView = [[[CartTableViewController alloc] init] autorelease];
    [navControl pushViewController:tabView animated:YES];
    navControl.navigationBar.hidden = NO;
}

你也应该释放你的 tabView 实例。

【讨论】:

    【解决方案2】:

    好的,我找到了问题。对于这样的事情,我需要从 shouldStartLoadWithRequest: 返回 NO。抱歉打扰了

    【讨论】: