2011-08-12 25 views
7

Tengo un montón de subViews en mi ViewController.iOS: ¿UIView pertenece a un UIViewController?

En la última capa tengo una UIView, y desde esta vista quiero llamar a la supervista y subir hasta que encuentre la UIView que pertenece a mi ViewController.

¿Es posible determinar si una UIView pertenece a un ViewController o no?

UIView *someView = self.superView; 

while (true) 
{ 
    if (someView BELONGS TO VIEWCONTROLLER) 
    { 
     // Now we know this view belongs to a VIewController 
     break; 
    } 

    someView = someView.superView; 
} 
+1

Hay una categoría escrito para UIView que podría ayudar: http://stackoverflow.com/questions/1340434/get-to-uiviewcontroller-from-uiview-on-iphone/3732812 # 3732812 –

+1

Posible duplicado: [¿Llegar a UIViewController desde UIView en iPhone?] (Http://stackoverflow.com/questions/1340434/get-to-uiviewcontroller-from-uiview-on-iphone) –

+0

No es un duplicado. Esta pregunta se trata de encontrar la vista que pertenece a un controlador de vista, no encontrar el controlador de vista para una vista determinada. –

Respuesta

9

Si desea averiguar si un determinado punto de vista es en la jerarquía gestionado por un controlador de vista y tiene un puntero al controlador de vista:

BOOL belongsToController = [aView isDescendantOfView:viewController.view]; 

Alternativamente, si usted quiere saber si una determinada vista es raíz de la jerarquía administrada por el controlador de vista pero no tiene un puntero al controlador de vista, puede atravesar la cadena de respuesta. De acuerdo con la UIResponder 's nextResponder documentación:

UIView implementa este método mediante la devolución del objeto UIViewController que lo gestiona (si tiene uno) o su supervista (si no lo hace)

tanto , si el siguiente respondedor de una determinada vista es UIViewController, esa vista debe ser la vista asociada con el controlador de vista.

if ([[aView nextResponder] isKindOfClass:[UIViewController class]]) { 
    // aView is the root of the view hierarchy managed by the view controller 
} 
3

trate de ir arriba en la jerarquía de puntos de vista y comprobar si la vista actual objeto es el mismo que el punto de vista de su controlador

Código sería algo como esto: (Escribe en textEdit, no tienen herramientas dev aquí, lo siento si hay algún error)

-(BOOL)view:(UIView *)aView belongsToController:(UIViewController *)viewController { 
    BOOL belongsToController = NO; 
    UIView *someView = [aView superView]; 
    while (someView != nil) { 
    if (viewController.view == someView) { 
     belongsToController = YES; 
    } 
    someView = [someView superView]; 
    } 
    return belongsToController; 
} 

acaba de probarlo y funciona para mí. Espero que haya sido útil. Vlad

+1

'[aView isDescendantOfView: viewController.view]' – albertamg

+0

no vi eso en los encabezados hasta ahora :) Gracias por señalarlo – Vlad

4

Los planteamientos de Vlad y albertamg son correctos también. Sin embargo también se puede recorrer la cadena de respuesta

for (UIView* next = [self superview]; next; next = next.superview) { 
    UIResponder* nextResponder = [next nextResponder]; 
    if ([nextResponder isKindOfClass:[UIViewController class]]) { 
     UIViewController *theControllerThatYouWANT = (UIViewController*)nextResponder; 
    } 
    } 
Cuestiones relacionadas