UITabBarController - Как получить доступ к контроллеру представления? - PullRequest
9 голосов
/ 29 ноября 2010

У меня есть uitabbarcontroller, который содержит несколько вкладок и viewControllers.Я пытаюсь перебрать контроллеры представления, чтобы найти правильный и вызвать метод.но тип контроллера представления, который я получаю, каждый раз, когда я прохожу цикл, является UINavigationController.Итак, как я могу просто получить доступ к контроллеру представления в моем tabBar?

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

Ответы [ 4 ]

19 голосов
/ 29 ноября 2010

Скорее всего, у вас есть UINavigationControllers в корне ваших вкладок, поэтому вам нужно получить доступ к ViewController, отображаемому UINavigationController.

Попробуйте изменить код на следующее:

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 голосов
/ 26 июня 2015

Это может быть достигнуто быстро с использованием фильтра массива:

    var vc = tabBar.viewControllers!.filter({ (v) -> Bool in
            return (v is YourViewController)
    })[0] as! UINavigationController
0 голосов
/ 07 мая 2018

В Swift 4, чтобы получить ViewController из UITabBarController.

    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 голосов
/ 27 сентября 2014

Вы больше не хотите этого делать ... Это лучший пример для NSNotificationCenter.

В двух строках кода вы можете выполнить одно и то же без лишних сложностей, связанных с циклическим переключением массивов контроллера представления. Смотрите этот пост:

NSNotificationCenter addObserver в Swift

...