我有一个uitabbarcontroller,它包含多个标签和viewControllers。 我试图循环通过视图控制器找到正确的一个并调用方法。 但我得到的视图控制器的类型,每次我通过循环是一个UINavigationController。那么我怎样才能简单地访问tabBar中的视图控制器?
for (UIViewController *v in self.tabBar.viewControllers)
{
if ([v isKindOfClass:[MyViewController class]])
{
MyViewController *myViewController = v;
[v doSomething];
}
}
答案 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行代码中,您可以完成相同的操作,而无需通过视图控制器阵列循环播放所有额外的内容。看这篇文章:
答案 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));
}