我的应用中有一个tabbar控制器作为主屏幕。一些选项卡嵌入了导航控制器。
这是我的问题: 第一个标签是app启动时的初始标签。在某些情况下,用户应该在应用程序启动后立即看到第二个屏幕B(在导航堆栈上)(在第一个屏幕的viewWillAppear中有触发的performSegue)。这应该是正常的。用户启动应用程序并立即看到第二个屏幕。当用户切换到不同的选项卡并返回时,这也适用。问题是当用户已经在第一个选项卡上并再次点击它时。然后堆栈被破坏用户看到第一个屏幕A,它将在短时间内激活到第二个屏幕B.用户可以清楚地看到这种转变。
First tab --> screen A --> screen B --> ...
|
Second tab --> screen T --> screen U --> ...
|
...
所以问题是如何防止这种行为?在这种情况下,用户不应该看到A和B之间的转换。
由于
答案 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将成为导航堆栈的根视图控制器,这就是您想要的。