2011-08-12 41 views
7

我在我的ViewController中有一堆的子視圖。iOS - UIView是否屬於UIViewController?

在最後一層,我有一個UIView,並從這個視圖我想調用超級視圖,直到我找到屬於我的ViewController的UIView。

是否有可能找出UIView是否屬於ViewController?

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

沒有爲UIView的書面類別可能幫助:http://stackoverflow.com/questions/1340434/get-to-uiviewcontroller-from-uiview-on-iphone/3732812#3732812 –

+1

可能的重複:[從iPhone上的UIView獲取UIViewController](http://stackoverflow.com/questions/1340434/get-to-uiviewcontroller-from-uiview-on-iphone) –

+0

不是重複的。這個問題是關於查找屬於視圖控制器的視圖,而不是查找給定視圖的視圖控制器。 –

回答

9

如果你想找出一個特定視圖是由視圖控制器管理的層次,你有一個指針視圖控制器:

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

另外,如果你想找出如果某個視圖是由視圖控制器管理的層次結構的,但您沒有指向視圖控制器的指針,則可以遍歷響應者鏈。根據UIRespondernextResponder文檔:

UIView實現通過返回管理該UIViewController對象此方法(如果有的話)或它的父(如果它不)

因此,如果某個視圖的下一個響應者是UIViewController,則該視圖必須是與視圖控制器關聯的視圖。

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

嘗試了意見層次往上走,並檢查當前視圖對象相同的控制器的視圖

代碼將是這樣的:(在TextEdit中寫道,沒有開發工具在這裏,對不起,如果有任何錯誤)

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

剛剛測試它,它適用於我。我希望這是有幫助的。 弗拉德

+1

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

+0

直到現在在標題中沒有看到:)謝謝指出它 – Vlad

4

Vlad's和albertamg的方法也是正確的。然而,你也可以遍歷響應鏈

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