2011-08-12 37 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; 
    } 
    }