问题弹出到标签栏开关上的根导航控制器

时间:2009-05-01 19:58:52

标签: iphone

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

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

任何提示? IPD

以下是一些代码来说明:

- (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];
}

1 个答案:

答案 0 :(得分:5)

-viewWillDisappear:方法不是修改navigationController的视图控制器堆栈的最佳位置,因为它在切换选项卡时以及在视图被按下时触发。

我玩了一下这个,发现最好的地方是 - [UITabBarControllerDelegate tabBarController:didSelectViewController:]方法。因此,首先您需要指定一个对象作为标签栏的委托(我使用了app委托)。将UITabBarController的delegate属性绑定到在代码或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];
   }
}