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

11

我有一个uitabbarcontroller,其中包含多个标签和视图控制器。 我正在尝试循环浏览视图控制器以找到正确的视图控制器并调用方法。 但是,每次我通过循环获取的视图控制器类型都是UINavigationController。那么我该如何简单地访问我的tabBar中的视图控制器?

for (UIViewController *v in self.tabBar.viewControllers)
{
     if ([v isKindOfClass:[MyViewController class]])
     {
          MyViewController *myViewController = v;
          [v doSomething];
     }
}
4个回答

20
你很可能在Tab根部有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];
     }
}

如何在AppDelegate类中实现此功能。 - Ali

2

可以在Swift中使用数组过滤器实现此功能:

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

1
在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
       }
   }

0

你真的不想再这样做了... 这是使用NSNotificationCenter更好的情况。

只需两行代码,您就可以完成相同的事情,而无需循环遍历视图控制器数组。请参阅此帖子:

在Swift中添加NSNotificationCenter观察者


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接