2011-08-12 14 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

可能な重複:[UIViewからiPhoneにUIViewControllerを取得しますか?](http://stackoverflow.com/questions/1340434/get-to-uiviewcontroller-from-uiview-on-iphone) –

+0

重複していません。この質問は、ビューコントローラに属しているビューを特定し、特定のビューのビューコントローラを検索しないことです。 –

答えて

9

あなたは、特定のビューは、ビューコントローラによって管理される階層であるかどうかを確認したいとあなたはビューコントローラへのポインタがある場合:あなたが知りたい場合は、代わりに

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

をあるビューがビューコントローラによって管理される階層のルートであるが、ビューコントローラへのポインタを持たない場合、レスポンダチェーンをトラバースすることができます。 UIRespondernextResponderドキュメントによると:

UIViewは、それを管理UIViewControllerオブジェクトを返すことで、このメソッドを実装したり、そのスーパービュー(これは、1つを持っている場合)ので

(それがない場合)あるビューの次のレスポンダがUIViewControllerである場合、そのビューはビューコントローラに関連付けられたビューでなければなりません。

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

試してみると、現在のビューオブジェクトは、コードがこのようなものになるだろう

お使いのコントローラのビューと同じであるかどうかを確認:(DEVツールを持っていない、テキストエディットで書きましたここでは間違いがあれば申し訳ありません)

-(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とalbertamgのアプローチも正しいです。あなたはまた、レスポンダチェーン

for (UIView* next = [self superview]; next; next = next.superview) { 
    UIResponder* nextResponder = [next nextResponder]; 
    if ([nextResponder isKindOfClass:[UIViewController class]]) { 
     UIViewController *theControllerThatYouWANT = (UIViewController*)nextResponder; 
    } 
    } 
関連する問題