有没有办法覆盖popToRootViewControllerAnimated:通过点击标签栏项目调用?

时间:2012-07-23 23:08:18

标签: uiviewcontroller uinavigationcontroller uitabbarcontroller uitabbaritem

当用户点击已经选中的相同标签栏项目时,我想覆盖popToRootViewControllerAnimated的动画:(当前:是)。

首次点击标签栏项目时,我会检查用户是否在标签栏项目根视图控制器的viewWillAppear:方法中登录,如果没有,请立即按下已禁用动画的登录控制器。 / p>

controller.navigationItem.hidesBackButton = YES;
[self.navigationController pushViewController:controller animated:NO];
[controller release];

当用户成功登录时,我弹回根控制器,[动画是]没问题:

[self.navigationController popViewControllerAnimated:YES];

但是,再次点击当前标签栏项时的默认行为似乎会进行以下调用:

-[UITabBarController _tabBarItemClicked:]

调用

-[UINavigationController popToRootViewControllerAnimated:]

我不知道是否将YES传递到最后一个,但是根据观察假设是这样。 如果用户没有登录但再次点击标签栏项,则看起来相同的[登录]控制器被推送/弹出动画,因为根控制器的viewDidLoad只是再次按下登录控制器。在这种情况下,我希望动画为NO。

为了解决我的问题,还有其他导航堆栈可以按下登录控制器,并且适合其标签栏项目上的水龙头弹出到根控制器。 我已经实现了UITabBarControllerDelegate协议和tabBarController:shouldSelectViewController:在登录控制器中检查点击的条项目根控制器是否相同,如果该控制器是控制器的类我想要特殊情况,但它似乎不优雅。不仅如此,现在登录控制器必须知道可以将其推送到导航堆栈的控制器的类。虽然我可以继续使用协议方法,但必须有更好的方法来实现这一点。

感谢您的意见和建议!

1 个答案:

答案 0 :(得分:1)

我认为这个问题的最佳解决方案是在选择标签栏按钮时呈现模态视图控制器,然后返回NO。从委托方法。