我想要一个全局导航堆栈。当用户更改选项卡或导航到同一选项卡中的新视图时,我想将新视图推送到全局导航堆栈。我希望导航栏中的后退按钮返回上一个视图,该视图有时是不同的选项卡,有时在同一个选项卡中有不同的视图。
答案 0 :(得分:4)
要实现此效果,您可以放弃UITabBarController - 并使用自定义视图或自定义标准UIToolbar来模拟栏。
有一个导航控制器,您的自定义工具栏始终可见,当点击按钮时,只需将您想要的视图推到导航堆栈。
答案 1 :(得分:0)
您可以通过将UINavigationController
的左侧栏按钮设置为您选择的按钮来实现相同的目的,处理操作方法并在点击事件上调用相应的标签栏按钮。
您需要在根视图控制器中执行所有操作...
<强>增加:强>
只需按下标签栏按钮,就无法获得根视图控制器上的后退按钮(导航控制器;与您的标签栏实例关联的根视图)。
你需要找到实现这一目标的方法,因为你没有从iOS获得这一点所以按下tabbar按钮的动作你需要有一个存储前一个选定索引的变量和一个为任何tabbar提供信息的方法通过传递索引...所以通过使用这两个你可以设置导航栏的左栏按钮的标题,并通过向左栏按钮指定适当的操作方法返回到上一个选项卡...
答案 2 :(得分:0)
您希望UIViewController
中的所有UITabBarController
加载到同一UINavigationController
吗?
这样的事情:
___ RootViewController ___
| |
UINavigationController UITabBarViewController
而不是
RootViewController
|
_________ UITabbarViewController _____________________
| | |
UINavigationController UINavigationController UINavigationController
您应尝试使用自己的自定义UITabBar
答案 3 :(得分:0)
我建议你创建一个包含NSInvocation对象的全局数组(NSMutableArray)。因此,每次推送视图控制器时,都需要创建NSInvocation,导航控制器作为目标,popViewConrollerAnimated:
作为选择器。如果您点击标签栏项目,则需要将标签栏控制器设置为目标,将setSelectedViewController:
设置为选择器。您还应使用
- (void)setArgument:(void *)buffer atIndex:(NSInteger)index
然后,每次弹出全局堆栈时,只需拨打[myLastInvocation invoke]
;
答案 4 :(得分:0)
我有类似的问题。我是这样做的:
要更改标签,请使用:例如,您要转到标签2及其第3个视图控制器
self.tabBarController.selectedIndex = 2;
[self.tabBarController.delegate tabBarController:self.tabBarController didSelectViewController:
[[[self.tabBarController.viewControllers objectAtIndex:2] viewControllers] objectAtIndex:3]];
答案 5 :(得分:0)
我得到了它的工作。根据我的经验,我需要mainTabBarController
和detailedNavigationController
作为两个根控制器。
UIApplicationDelegate
类的这两种方法完美无缺:
- (void) showDetailedTab
{
CGRect normalRect = self.window.bounds;
CGRect rightRect = CGRectOffset(normalRect, normalRect.size.width, 0);
CGRect leftRect = CGRectOffset(normalRect, -normalRect.size.width, 0);
detailedNavigationController.view.frame = rightRect;
mainTabBarController.view.frame = normalRect;
[self.window addSubview:mainTabBarController.view];
[self.window addSubview:detailedNavigationController.view];
[UIView animateWithDuration:0.35 delay:0.0 options:UIViewAnimationCurveEaseOut
animations: ^{
detailedNavigationController.view.frame = normalRect;
mainTabBarController.view.frame = leftRect;
}
completion: ^(BOOL finished){
[mainTabBarController.view removeFromSuperview];
}];
}
- (void) showMainTabBar
{
CGRect normalRect = self.window.bounds;
CGRect rightRect = CGRectOffset(normalRect, normalRect.size.width, 0);
CGRect leftRect = CGRectOffset(normalRect, -normalRect.size.width, 0);
mainTabBarController.view.frame = leftRect;
detailedNavigationController.view.frame = normalRect;
[self.window addSubview:mainTabBarController.view];
[self.window addSubview:detailedNavigationController.view];
[UIView animateWithDuration:0.35 delay:0.0 options:UIViewAnimationCurveEaseOut
animations: ^{
mainTabBarController.view.frame = normalRect;
detailedNavigationController.view.frame = rightRect;
}
completion: ^(BOOL finished){
[detailedNavigationController.view removeFromSuperview];
}];
}
我认为这个解决方案比模拟标签栏更好,因为它不会破坏UIViewContoller
的生命周期。