Tab+NavigationController流程
Tab+NavigationController flow
我的应用程序中有一个标签栏控制器作为主屏幕。一些选项卡嵌入了导航控制器。
这是我的问题:
第一个选项卡是应用程序启动时的初始选项卡。在某些情况下,用户应该在应用程序启动后立即看到第二个屏幕 B(在导航堆栈上)(在第一个屏幕的 viewWillAppear 中触发的 performSegue)。这可以正常工作。用户启动应用程序并立即看到第二个屏幕。当用户切换到不同的选项卡并返回时,这也适用。问题是当用户已经在第一个选项卡上并再次点击它时。然后堆栈被销毁,用户看到第一个屏幕 A,它将在短时间内动画到第二个屏幕 B。用户可以清楚地看到此转换。
First tab --> screen A --> screen B --> ...
|
Second tab --> screen T --> screen U --> ...
|
...
所以问题是如何防止这种行为?在这种情况下,用户不应看到 A 和 B 之间的转换。
谢谢
为什么不将代码从屏幕 A 更改为在特定条件下执行下一屏幕 B 的转场。,
只需在 TabbarController Class(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,享受编码吧!
这是 UITabBarController
的预期行为,它会将导航控制器弹出到其堆栈中的第一个视图控制器。
如果您不希望在用户点击选项卡栏项目时在某些情况下出现屏幕 A,只需从导航堆栈中删除第一个视图控制器,在从 A 推送到 B 后执行类似的操作(表单B 视图控制器的 viewDidLoad: 中的实例):
NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray: navigationController.viewControllers];
[allViewControllers removeObjectAtIndex: 0];
navigationController.viewControllers = allViewControllers;
这样屏幕 B 将成为您导航堆栈的根视图控制器,这就是您想要的。
我的应用程序中有一个标签栏控制器作为主屏幕。一些选项卡嵌入了导航控制器。
这是我的问题: 第一个选项卡是应用程序启动时的初始选项卡。在某些情况下,用户应该在应用程序启动后立即看到第二个屏幕 B(在导航堆栈上)(在第一个屏幕的 viewWillAppear 中触发的 performSegue)。这可以正常工作。用户启动应用程序并立即看到第二个屏幕。当用户切换到不同的选项卡并返回时,这也适用。问题是当用户已经在第一个选项卡上并再次点击它时。然后堆栈被销毁,用户看到第一个屏幕 A,它将在短时间内动画到第二个屏幕 B。用户可以清楚地看到此转换。
First tab --> screen A --> screen B --> ...
|
Second tab --> screen T --> screen U --> ...
|
...
所以问题是如何防止这种行为?在这种情况下,用户不应看到 A 和 B 之间的转换。
谢谢
为什么不将代码从屏幕 A 更改为在特定条件下执行下一屏幕 B 的转场。,
只需在 TabbarController Class(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,享受编码吧!
这是 UITabBarController
的预期行为,它会将导航控制器弹出到其堆栈中的第一个视图控制器。
如果您不希望在用户点击选项卡栏项目时在某些情况下出现屏幕 A,只需从导航堆栈中删除第一个视图控制器,在从 A 推送到 B 后执行类似的操作(表单B 视图控制器的 viewDidLoad: 中的实例):
NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray: navigationController.viewControllers];
[allViewControllers removeObjectAtIndex: 0];
navigationController.viewControllers = allViewControllers;
这样屏幕 B 将成为您导航堆栈的根视图控制器,这就是您想要的。