Tab + NavigationController流程

时间:2015-04-19 11:47:06

标签: ios uinavigationcontroller uitabbarcontroller

我的应用中有一个tabbar控制器作为主屏幕。一些选项卡嵌入了导航控制器。

这是我的问题: 第一个标签是app启动时的初始标签。在某些情况下,用户应该在应用程序启动后立即看到第二个屏幕B(在导航堆栈上)(在第一个屏幕的viewWillAppear中有触发的performSegue)。这应该是正常的。用户启动应用程序并立即看到第二个屏幕。当用户切换到不同的选项卡并返回时,这也适用。问题是当用户已经在第一个选项卡上并再次点击它时。然后堆栈被破坏用户看到第一个屏幕A,它将在短时间内激活到第二个屏幕B.用户可以清楚地看到这种转变。

First tab --> screen A --> screen B --> ...
|
Second tab --> screen T --> screen U --> ...
|
...

所以问题是如何防止这种行为?在这种情况下,用户不应该看到A和B之间的转换。

由于

2 个答案:

答案 0 :(得分:1)

为什么不将代码从屏幕A更改为perfrom segue到下一个屏幕B unser CERTAIN条件。

只需在方法中使用TabbarController类(Tabbar的子类)中的CERTAINcondition,

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    if (tabBarController.selectedIndex == 0)
    {  
         if (CERTAIN condition True) {
              UITabBar tabbar = self.tabBarController.tabBar;
              NSArray *controlrs = self.viewControllers; 
              NSMutableArray *controllerCopy = [controlrs mutablecopy];
              SCREEN_B_class *bClassObj =  . .. //Tab 1 class Just Screen B, not Screen A -> ScreenB
              [controllerCopy replaceObjectsAtIndex:[NSIndexSet indexSetWithIndex:0] withObjects:[NSArray arrayWithObjects:bClassObj]]
              tabBarController.viewControllers = controllerCopy;

         }

    }
}

希望这会对你有所帮助,

HTH,享受编码!!

答案 1 :(得分:0)

这是UITabBarController的预期行为,它会将导航控制器弹出到其堆栈中的第一个视图控制器。

如果您不想在用户点击标签栏项目时在某些条件下显示屏幕A,只需从导航堆栈中删除第一个视图控制器,在从A推送到B后执行类似的操作(表单viewDidLoad:B视图控制器中的实例):

NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray: navigationController.viewControllers];
[allViewControllers removeObjectAtIndex: 0];
navigationController.viewControllers = allViewControllers;

这样,屏幕B将成为导航堆栈的根视图控制器,这就是您想要的。