2011-08-12 17 views
7

मेरे पास मेरे व्यू कंट्रोलर में सबव्यूज़ का एक गुच्छा है।आईओएस - क्या UIView UIViewController से संबंधित है?

अंतिम परत में मेरे पास एक UIView है, और इस दृश्य से मैं पर्यवेक्षक को कॉल करना चाहता हूं और जब तक मुझे अपने व्यू कंट्रोलर से संबंधित UIView नहीं मिल जाता तब तक ऊपर जाना चाहता हूं।

क्या यह पता लगाना संभव है कि कोई UIView व्यू कंट्रोलर से संबंधित है या नहीं?

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

संभावित डुप्लिकेट: [आईआईवीव से यूआईवीव कंट्रोलर को आईफोन पर प्राप्त करें?] (Http://stackoverflow.com/questions/1340434/get-to-uiviewcontroller-from-uiview-on-iphone) –

+0

डुप्लिकेट नहीं। यह प्रश्न किसी व्यू कंट्रोलर से संबंधित दृश्य को ढूंढने के बारे में है, किसी दिए गए दृश्य के लिए व्यू कंट्रोलर नहीं ढूंढ रहा है। –

उत्तर

9

आप पता लगाने के लिए अगर एक निश्चित दृश्य पदानुक्रम एक दृश्य नियंत्रक द्वारा प्रबंधित में है चाहते हैं और आप दृश्य नियंत्रक करने के लिए एक सूचक है:

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

वैकल्पिक रूप से, अगर आप पता लगाना चाहते हैं यदि एक निश्चित दृश्य रूट नियंत्रक द्वारा प्रबंधित पदानुक्रम के रूट है लेकिन आपके पास व्यू कंट्रोलर के लिए कोई पॉइंटर नहीं है, तो आप प्रतिक्रियाकर्ता श्रृंखला को पार कर सकते हैं। UIResponder के nextResponder प्रलेखन के अनुसार:

UIViewUIViewController उद्देश्य यह है कि यह प्रबंधन करता है वापस लौट कर इस पद्धति को लागू करता है या उसके superview (अगर यह एक है) (यदि ऐसा नहीं होता है)

इसलिए , यदि किसी निश्चित दृश्य का अगला उत्तरदाता 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; 
} 

ने अभी इसका परीक्षण किया और यह मेरे लिए काम करता है। मुझे उम्मीद है कि यह सहायक था। Vlad

+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; 
    } 
    } 
संबंधित मुद्दे