9

Tengo uitabbarcontroller, que contiene varias pestañas y viewControllers. Estoy intentando recorrer los controladores de vista para encontrar el correcto y llamar a un método. pero el tipo de controlador de vista que obtengo, cada vez que paso por el bucle, aparece un UINavigationController. Entonces, ¿cómo puedo simplemente acceder a un controlador de vista en mi tabBar?UITabBarController: cómo acceder a un controlador de vista?

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

Respuesta

19

Lo más probable tienen UINavigationControllers en la raíz de las pestañas, así que lo que tendrá que hacer es acceder a la mostrada por el ViewController UINavigationController.

trate de cambiar el código por lo siguiente:

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]; 
    } 
} 
+0

cómo hacerlo en la clase de delegado de la aplicación – Ali

0

Usted realmente no quiere seguir con esto ... Esta es una mejor caso para NSNotificationCenter.

En 2 líneas de código, puede hacer lo mismo, sin todo el dramatismo adicional del ciclismo a través de las matrices del controlador de vista. Ver este post:

NSNotificationCenter addObserver in Swift

2

Esto se puede lograr en Swift en un uso de un filtro de matriz:

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