替换 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的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 通用UITabBarController替换

将另一个视图控制器推送到 UITabBarController 视图中

用 UIToolBar 替换 UITabBar

UITabBarController 问题中的 UINavigationController

UITabBarController 中的 UINavigationController 没有完全包裹 UIViewController

嵌入在 NavigationController 中的 UITabBarController