替换 UITabBarController 中的 UIViewController
Posted
技术标签:
【中文标题】替换 UITabBarController 中的 UIViewController【英文标题】:Replace UIViewController in UITabBarController 【发布时间】:2016-03-24 12:11:15 【问题描述】:情况: 我有一个带有 TabBarController 的应用程序。
其中一个选项卡需要正确登录 Web 服务才能正常运行。 选择 Tab 后,我检查是否登录成功,如果没有,我想在该选项卡内显示一个登录界面。
到目前为止,通过使用 segue,我设法显示了一个带有登录界面的模态 UIViewController,但它隐藏了 Tab Bar,禁止用户使用应用程序的其余部分。
我可以通过只显示一个 UIAlertView 来解决这个问题,但我真的不喜欢这个选项。
那么,给定一个 myTabRegularViewController 和一个 myTabLoginViewController,这里最好的方法是什么。而且,第一个要加载的 ViewController 是否重要?
编辑:
我的首选逻辑如下。在 myTabRegularViewController 我有这个代码:
- (void)viewDidLoad
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if ([userDefaults objectForKey:@"loginSuccess"])
.....
else
NSLog(@"Not Logged In");
//load myTabLoginViewController
【问题讨论】:
不能调整登录视图控制器的大小吗? 这有助于显示标签吗? 【参考方案1】:创建一个实现UITabBarControllerDelegate
协议的对象并实现tabBarController:shouldSelectViewController:
方法。
显然你会想要一个与我不同的测试,但这里有一个快速示例来展示这个想法。 (我创建了两个选项卡,一个带有基本视图控制器,一个带有导航控制器。)
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
if ([viewController isKindOfClass:[UINavigationController class]])
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *login = [storyboard instantiateViewControllerWithIdentifier:@"login_controller"];
[(UINavigationController *)viewController pushViewController:login animated:NO];
return YES;
【讨论】:
不确定这是如何工作的。 tabBarController:shouldSelectViewController: 应该何时/如何被触发? 如果您将实现它的对象设置为标签栏控制器的代理,则当有人尝试选择标签时会触发它。【参考方案2】:就我而言,使用 segues 的解决方案是最简单的。为了不隐藏 TabBar,我不得不将 myTabRegularViewController 嵌入到 NavigationController 中。
【讨论】:
以上是关于替换 UITabBarController 中的 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章
将另一个视图控制器推送到 UITabBarController 视图中
UITabBarController 问题中的 UINavigationController
UITabBarController 中的 UINavigationController 没有完全包裹 UIViewController