【问题标题】:UITabBarController - How to access a view controller?UITabBarController - 如何访问视图控制器?
【发布时间】: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];
     }
}

【问题讨论】:

    标签: iphone uiviewcontroller uinavigationcontroller uitabbarcontroller


    【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多