UITabBarController - 如何访问视图控制器?

Posted

技术标签:

【中文标题】UITabBarController - 如何访问视图控制器?【英文标题】:UITabBarController - How to access a view controller? 【发布时间】:2010-11-29 18:16:41 【问题描述】:

我有一个 uitabbar 控制器,它包含多个选项卡和视图控制器。 我正在尝试遍历视图控制器以找到正确的控制器并调用方法。 但是我得到的视图控制器的类型,每次我通过循环时都是一个 UINavigationController。那么如何才能简单地访问我的 tabBar 中的视图控制器呢?

for (UIViewController *v in self.tabBar.viewControllers)

     if ([v isKindOfClass:[MyViewController class]])
     
          MyViewController *myViewController = v;
          [v doSomething];
     

【问题讨论】:

【参考方案1】:

您很可能在选项卡的根目录中有 UINavigationController,因此您要做的是访问 UINavigationController 显示的 ViewController。

尝试将代码更改为以下内容:

for (UIViewController *v in self.tabBar.viewControllers) 

     UIViewController *vc = v;

     if ([v isKindOfClass:[UINavigationController class]]) 
         vc = [v visibleViewController];
     

     if ([vc isKindOfClass:[MyViewController class]]) 
          MyViewController *myViewController = vc;
          [vc doSomething];
     

【讨论】:

如何在应用委托类中做到这一点【参考方案2】:

这可以通过使用数组过滤器快速实现:

    var vc = tabBar.viewControllers!.filter( (v) -> Bool in
            return (v is YourViewController)
    )[0] as! UINavigationController

【讨论】:

【参考方案3】:

在 Swift 4 中,从 UITabBarController 获取 ViewController。

    let tabBarController : UITabBarController = self.window?.rootViewController as! UITabBarController;
    tabBarController.selectedIndex = 0

    let navigationController  = tabBarController.selectedViewController as! UINavigationController
    let controllers = navigationController.viewControllers // will give array
    if controllers.count > 0 
        if let viewC = controllers[0] as? DesiredViewController 
       // do desired work
       
   

【讨论】:

【参考方案4】:

你真的不想再这样做了……这对 NSNotificationCenter 来说是一个更好的例子。

在 2 行代码中,您可以完成相同的事情,而无需在视图控制器数组中循环使用所有额外的戏剧。看这篇文章:

NSNotificationCenter addObserver in Swift

【讨论】:

以上是关于UITabBarController - 如何访问视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何从它的项目 ViewControllers 访问 UITabBarController 的变量

如何减少uitabbarcontroller中选项卡的点击访问长度?

如何从应用程序委托访问 uitabbarcontroller 内的 uinavigationcontroller 内的 uitableview?

无法从模态 ViewController 访问 UITabBarController

UISplitview:从 appDelegate 访问 UITabBarController

从 UITabBarController 和 UINavigationController 访问 UIViewController