2011-08-12 10 views
7

Mam kilka subViews w moim ViewController.iOS - czy UIView należy do kontrolera UIViewController?

W ostatniej warstwie posiadam UIView, az tego widoku chcę wywołać superview i idę w górę dopóki nie znajdę UIView, który należy do mojego ViewController.

Czy można sprawdzić, czy UIView należy do ViewController, czy nie?

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

Jest to kategoria napisany dla UIView, które mogą pomóc: http://stackoverflow.com/questions/1340434/get-to-uiviewcontroller-from-uiview-on-iphone/3732812 # 3732812 –

+1

Możliwy duplikat: [Uzyskaj do UIViewController z UIView na iPhone?] (Http://stackoverflow.com/questions/1340434/get-to-uiviewcontroller-from-uiview-on-iphone) –

+0

Nie duplikat. To pytanie dotyczy wyszukiwania widoku należącego do kontrolera widoku, a nie znajdowania kontrolera widoku dla danego widoku. –

Odpowiedz

9

Jeśli chcesz dowiedzieć się, czy dany pogląd jest w hierarchii zarządzanej przez kontrolera widoku i masz wskaźnik do kontrolera widoku:

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

Ewentualnie, jeśli chcesz dowiedzieć się, jeśli określony widok jest root hierarchii zarządzanej przez kontroler widoku, ale nie masz wskaźnika do kontrolera widoku, możesz przemieścić łańcuch respondera. Według UIResponder „s nextResponder dokumentacji:

UIView implementuje tej metody, zwracając obiekt UIViewController że zarządza nim (jeśli posiada) lub jego Superview (jeśli nie)

Dlatego , jeśli następnym respondem określonego widoku jest UIViewController, widok ten musi być widokiem powiązanym z kontrolerem widoku.

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

spróbować iść w górę w hierarchii poglądów i sprawdzić, czy obecny obiekt widoku jest taka sama jak Zdaniem regulatora

kod byłoby coś takiego: (napisał w TextEdit, nie mają narzędzi dev tutaj, przepraszam jeśli jakieś pomyłki)

-(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; 
} 

właśnie przetestowałem to i to działa dla mnie. Mam nadzieję, że to było pomocne. Vlad

+1

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

+0

nie widział tego w nagłówkach do tej pory :) Dzięki za wskazanie go – Vlad

4

Podejścia Vlada i albertamga również są prawidłowe. Jednak można również przechodzić przez łańcuch responder

for (UIView* next = [self superview]; next; next = next.superview) { 
    UIResponder* nextResponder = [next nextResponder]; 
    if ([nextResponder isKindOfClass:[UIViewController class]]) { 
     UIViewController *theControllerThatYouWANT = (UIViewController*)nextResponder; 
    } 
    } 
Powiązane problemy