popToRootViewControllerAnimated在shouldSelectViewController UITabBarControllerDelegate方法的上下文中无法正确执行

时间:2012-11-01 22:30:34

标签: objective-c uinavigationcontroller uitabbarcontroller

我为我的UITabBarController设置了一个委托,并有以下委托方法:

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {    
        [self.navigationController popToRootViewControllerAnimated: YES];
        return NO;
}

该方法触发并在上下文中,我是一个或两个级别的表视图。根视图控制器显示正确,但导航栏不会重置,并且仍然有一个或两个级别的“后退”按钮进入表视图。

(上面的委托方法是我在我的应用程序中尝试做的简化形式,但仍然存在问题。在我的应用程序中,我需要在返回原始选项卡时显示根视图,所以我在我离开之前尝试弹出根视图。

popToRootViewControllerAnimated not working correctly表示存在时滞问题,但这似乎不是我的情况。在执行shouldSelectViewController之前,我可以等待我想要的时间,并且导航栏“后退”按钮仍然混乱。

代表是:

@interface BasicPlaceItemComment : UIViewController<UIAlertViewDelegate, UITabBarControllerDelegate> {
    // data members ommitted
} 

这是我从中派生所有表视图的类。

2 个答案:

答案 0 :(得分:0)

您确定该方法是在正确的上下文中吗? 谁符合TabBarDelegate?如果它是你的AppDelegate,那么self.navigationController可能是零。 如果你使用TabBar并且你有多个导航控制器,那么你可能在错误的控制器上调用popToRootViewController。 尝试插入此内容:

NSLog(@"%@", self.navigationController);

在方法的开头,确保获得正确的导航控制器的地址。

发布更多代码可能会有所帮助。

答案 1 :(得分:0)

问题似乎是我正在继承UINavigationController以解决不同的问题。当我删除这个子类时,问题就消失了。也就是说,当我在没有子类化UINavigationController的情况下执行popToRootViewController时,“后退”按钮不再被搞乱。然而,这引发了另一个问题。我是UINavigationController的子类,以解决UINavigationController and UINavigationBarDelegate.ShouldPopItem() with MonoTouch

中陈述的问题

通过我的导航栏和我的标签栏,我希望能够发出一条消息“你确定要退出吗?”当显示的视图中的某些数据发生变化(导航离开该视图,并可能取消导航远离该视图)时,按下后退按钮(或其他选项卡)时发出警报。

所以,虽然这是一个部分答案,但我的问题仍然存在。当用户键入后退按钮或其他选项卡时,我仍然需要一种获得控制的方法。所以,我似乎需要: 1)为UINavigationBarDelegate方法设置一个与UINavigationController不同的委托的方法shouldPopItem,或者 2)当我点击一个标签并调用popToRootViewController时,有些方法可以将UINavigationController子类化,但不会像当前发生的那样搞砸后退按钮。

进一步的想法?

更多关于11/3/12

导致问题的不是UINavigationController本身的子类化。我无意中从我的委托方法中返回NO

// This method returns true when the navigation bar should pop an item
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {

当我做了一个popToRootViewController。我现在在我的UINavigationController子类中有一个方法:

- (void) popToRoot {
    regularPop = YES;
    [self popToRootViewControllerAnimated: YES];
}

导致shouldPopItem返回YES,我使用它而不是popToRootViewController。我的大多数问题都解决了!