【问题标题】:Problem popping to root nav controller on tab bar switch在选项卡栏开关上弹出到根导航控制器的问题
【发布时间】:2009-05-01 19:58:52
【问题描述】:

试图模仿/复制内置通讯录,特别是在编辑联系人或从电话应用程序内部查看现有联系人信息时的行为。当您导航到另一个选项卡时,编辑状态会重置并弹出“新联系人”或“信息”视图,因此当您返回“联系人”选项卡时,您会回到根表视图。

我使用 setEditing: 和 popToViewController: 在 vi​​ewWillDisappear 中完成了大部分工作,但是当用户使用后退按钮从 Info 视图导航到 table 视图时,我得到了奇怪的行为。即使我弹出到根表视图控制器,它似乎使用的是默认 UITableViewController 类而不是我的子类(例如,标准选择行为而不是我的覆盖来推送详细视图。)

有什么提示吗?瞳距

这里有一些代码来说明:

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    // This is to clean up from the colored bar in detail view
    self.navigationController.navigationBar.tintColor = nil;

    // These are to match the behaviour of Contacts app
    [self setEditing:NO animated:NO];

    // This is the tricky part: works when switching tabs, but not when back button was going to pop anyway!!
    [self.navigationController popToViewController:rootViewControllerForTab animated:NO];
}

【问题讨论】:

    标签: iphone


    【解决方案1】:

    -viewWillDisappear: 方法不是为您的 navigationController 修改视图控制器堆栈的最佳位置,因为它会在您切换选项卡和将视图推送到其顶部时触发。

    我玩了一下,发现最好的地方是 -[UITabBarControllerDelegate tabBarController:didSelectViewController:] 方法。因此,首先您需要指定一个对象作为标签栏的委托(我使用了应用委托)。将 UITabBarController 的委托属性绑定到在代码或 Interface Builder 中实现 UITabBarControllerDelegate 协议的对象。

    然后,实现 -tabBarController:didSelectViewController: 方法。现在的诀窍是如何判断您的“通讯录”选项卡何时被切换到。我使用 UINavigationController 类型的属性(选项卡的根视图控制器)跟踪相关选项卡的视图控制器。使用 Interface Builder 将 tab1NavController 属性绑定到实际实例后,可以使用它与 viewController 参数进行比较,以查看刚刚选择了哪个选项卡。

    @interface Pop2RootTabSwitchAppDelegate : NSObject 
        <UIApplicationDelegate, UITabBarControllerDelegate> {
      UINavigationController *tab1NavController;
    }
    @property (nonatomic, retain) IBOutlet UINavigationController *tab1NavController;
    @end
    
    @implementation Pop2RootTabSwitchAppDelegate
    
    - (void)tabBarController:(UITabBarController *)tabBarController 
      didSelectViewController:(UIViewController *)viewController {
       NSLog(@"[%@ tabBarController:%@  didSelectViewController:%@]", [self class], 
           tabBarController, viewController);
       if (viewController == tab1NavController) {
           NSLog(@"viewController == tab1NavController");
           [tab1NavController popToRootViewControllerAnimated:NO];
       }
    }
    

    【讨论】:

    • 这是赢家...谢谢! (我一直专注于在退出时清理状态,从未考虑在进入时设置状态。)
    • 当我尝试这个时,如果我将动画设置为 NO.. 我必须设置为 YES,这使它有点笨拙。 "-[DetailViewController tableView:cellForRowAtIndexPath:]: message sent to deallocated instance" ......有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多