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

时间:2010-11-29 18:16:41

标签: iphone uiviewcontroller uinavigationcontroller uitabbarcontroller

我有一个uitabbarcontroller,它包含多个标签和viewControllers。 我试图循环通过视图控制器找到正确的一个并调用方法。 但我得到的视图控制器的类型,每次我通过循环是一个UINavigationController。那么我怎样才能简单地访问tabBar中的视图控制器?

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

4 个答案:

答案 0 :(得分:19)

你很可能在你的选项卡的根目录下有UINavigationControllers,所以你想要做的是访问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];
     }
}

答案 1 :(得分:2)

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

doc

答案 2 :(得分:0)

你真的不想再这样做......对于NSNotificationCenter来说这是一个更好的案例。

在2行代码中,您可以完成相同的操作,而无需通过视图控制器阵列循环播放所有额外的内容。看这篇文章:

NSNotificationCenter addObserver in Swift

答案 3 :(得分:0)

在Swift 4中,从UITabBarController获取ViewController。

public int countGreater(T x)
{
    BSTNode<T> base = root;
    if(base == null) return 0;
    int greater = great(base, x);
    return greater;
}

private int great(BSTNode<T> base, T x)
{
    int numG = 0;
    Iterator<T> getGreatest = getIterator(Postorder);

    while(getGreatest.hasNext())
    {
        if(compare(getGreatest.next(), x) > 0)
        {
            numG++;
        }
    }

    return numG;
}

public int compare(T a, T b)
{
    return (a.compareTo(b));
}