如何在AppDelegate中从TabBarController获取ViewController?

12

我使用iOS5的故事板,我的初始视图控制器是TabBarController,它有四个与view1&view2&view3&view4相关联的关系,那么,我该如何获取view3的视图控制器?

我尝试了:

[[[[self.window.rootViewController navigationController] tabBarController] viewControllers] objectAtIndex:2];

但它不起作用...

5个回答

35

你说你的初始(根)视图控制器是UITabBarController,但你指的是一个带有导航控制器和标签栏控制器的视图控制器。你是否在你的视图控制器层次结构中混淆了?

编辑:

如果你的根视图控制器实际上只是一个标签栏控制器,并且你想获取第三个标签,则代码如下:

[[((UITabBarController *)self.window.rootViewController) viewControllers] objectAtIndex:2];

UIViewController没有声明名为'viewControllers'的选择器。 - Ariel Zehao Zhang
2
是的,它可以工作。我太蠢了。UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController; - Ariel Zehao Zhang

9
[self.tabBarController setSelectedIndex:2];

2
虽然这是最简单的答案,但这是获取tabBarController的最简单和最好的方法。UITabBarController为UIViewController添加了一个类别,如果视图在其中,则返回UITabBarController,否则返回NULL。 - Ron Davis
1
有没有办法在选定的索引处获取对象(视图控制器)? - Tunvir Rahman Tusher

7

尝试这个方法

在任何视图控制器中

 YourViewController *yourViewController= (YourViewController*)  [self.tabBarController.viewControllers objectAtIndex:3];

这将返回您的那个视图控制器对象。将其转换为您的视图控制器,您就可以使用它了。快跑吧!


2
这个答案的 Swift 3 版本会是什么? - user3976000

4

Swift 4.0

let viewC = self?.tabBarController.viewControllers.first // will give single Navigation Controller on index 0
let viewC = self?.tabBarController?.viewControllers// will give array of Navigation Controller

此外,您可以检查可见的视图控制器

if let nav = viewC as? UINavigationController {
   if nav.visibleViewController is YourViewControllerName{
        // Do Code
     }
}

3
   UIViewController *loginViewController=self.window.rootViewController;

   UITabBarController *controller=loginViewController.tabBarControllerObj;

   UIViewController *selectedController=controller.selectedViewController;

您想获取选定的视图控制器。

如果要获取所有视图控制器,只需替换

NSArray *viewControllers = [controller viewControllers];

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