1

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

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

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

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

popToRootViewControllerAnimated 无法正常工作表明存在时间滞后问题,但这似乎不是我的情况。在执行 shouldSelectViewController 之前,我可以等待多久,导航栏的“后退”按钮仍然混乱。

代表是:

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

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

4

2 回答 2

0

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

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

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

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

于 2012-11-01T23:41:45.743 回答
0

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

使用我的导航栏和标签栏,我希望能够发布一条消息“你确定要退出吗?” 在显示视图中的某些数据发生更改的情况下(在导航离开该视图之前,并可能取消导航离开该视图),按下后退按钮(或另一个选项卡)时发出警报。

因此,虽然这是部分答案,但我的问题仍然存在。当用户键入后退按钮或另一个选项卡时,我仍然需要一种方法来获得控制权。所以,我似乎需要:1)一种方法具有与 UINavigationBarDelegate 方法 shouldPopItem 的 UINavigationController 不同的委托,或 2)某些方法可以将 UINavigationController 子类化,但不会像当前单击选项卡时那样弄乱后退按钮并调用 popToRootViewController。

进一步的想法?

更多关于 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。我的大部分问题都解决了!

于 2012-11-03T01:43:58.147 回答