जांचें कि क्या कोई सबव्यू एक दृश्य में है


97

मैं एक ऐप बना रहा हूँ जहाँ मैं a addSubview:पर उपयोग करके व्यू में सबव्यू जोड़ता हूँ IBAction। उसी तरह, जब उस बटन IBActionको फिर से छुआ जाता है , तो उस removeFromSuperviewपर जोड़े गए उस सबव्यू पर कॉल करना चाहिए IBAction:

PSEUDO कोड

-(IBAction)showPopup:(id)sender 
{
    System_monitorAppDelegate *delegate = (System_monitorAppDelegate *)[[UIApplication sharedApplication] delegate];
    UIView *rootView = delegate.window.rootViewController.view;

    if([self popoverView] is not on rootView) 
    { 
        [rootView addSubview:[self popoverView]];
    } 
    else 
    {
        [[self popoverView] removeFromSuperview];
    }

}

जवाबों:


271

आप शायद UIView के संदर्भ-(BOOL)isDescendantOfView:(UIView *)view; में UIView की तलाश कर रहे हैं ।

रिटर्न वैल्यू यस अगर रिसीवर देखने का एक तत्काल या दूर का सबव्यू है या यदि देखने वाला खुद रिसीवर है; अन्यथा नहीं।

आप एक कोड के साथ समाप्त करेंगे:

उद्देश्य सी

- (IBAction)showPopup:(id)sender {
    if(![self.myView isDescendantOfView:self.view]) { 
        [self.view addSubview:self.myView];
    } else {
        [self.myView removeFromSuperview];
    }
}

स्विफ्ट 3

@IBAction func showPopup(sender: AnyObject) {
    if !self.myView.isDescendant(of: self.view) {
        self.view.addSubview(self.myView)
    } else {
        self.myView.removeFromSuperview()
    }
}

2
काम नहीं करता है, बस उस पर दृश्य जोड़ता है। मैं वास्तविक मामले को दिखाने के लिए कोड को संपादित करूँगा
pmerino

@ zad0xsis - मुझे असली मामला समझ नहीं आ रहा है। यदि आपने addSubview:अगली बार विधि का उपयोग करके दूसरा दृश्य जोड़ा है (जो कि संभवत: पहली बार है), तो अगली बार, आप दूसरे भाग पर पहुंचेंगे क्योंकि दूसरा दृश्य अब पहले का एक उप-भाग है। क्या यह नहीं है कि आप क्या करने की कोशिश कर रहे थे? आप शायद एक और mecanism देख रहे हैं जैसे एक दृश्य नियंत्रक को सामान्य रूप से prensenting करना?

खैर, popoverViewrootView (rootViewController) का एक उपक्षेत्र है। मैं जांच करना चाहता हूं कि क्या यह स्क्रीन पर है (यदि इसका रूटव्यू सुपरवाइवे के रूप में है) और यदि ऐसा है तो इसे हटा दें अन्यथा यदि यह नहीं है तो इसे जोड़ दें
pmerino

है [self popoverView]एक नव हर बार पॉपओवर बनाया लौटने? यदि यह एक ही दृश्य है, तो यह एक दृश्य जोड़ नहीं सकता है, क्योंकि यह एक ऐसा दृश्य है जो पहले से ही एक सेशन नहीं है। यदि popoverViewविधि हर बार एक नया निर्माण कर रही है, तो यह हमेशा दृश्य पदानुक्रम में नहीं होगा
bshirley

1
एक महत्वपूर्ण विचार जो मुझे यहाँ फँसाता है: जब हटाने तब जो आप IBOutlet गुणों (या ivars) के साथ पकड़ रहे हैं, उन्हें जोड़ने पर आपको यह सुनिश्चित करने की आवश्यकता है कि गुण (ivars) मजबूत हैं , या वे (पूर्व ARC) वे बरकरार हैं । डिफ़ॉल्ट रूप से अगर आप आउटलेट बनाने के लिए नियंत्रक से दृश्य को ctrl- ड्रैग करते हैं, तो यह इसे उतना ही कमजोर बना देगा क्योंकि यह मानता है कि nib में बनाया गया दृश्य इसका मालिक होगा, इसलिए आपको एक मजबूत संदर्भ की आवश्यकता नहीं है। लेकिन अगर आप इसे प्रोग्रामेटिक रूप से हटाते हैं, तो यह नियंत्रण को समाप्त कर देगा और आपके संदर्भ को शून्य (ARC) में सेट कर देगा।
Rhubarb

18

इसे इस्तेमाल करे:

-(IBAction)showPopup:(id)sender
{
    if (!myView.superview)
        [self.view addSubview:myView];
    else
        [myView removeFromSuperview];
}

बहुत बढ़िया! कभी-कभी इसे myView.view.superview की आवश्यकता होती है, लेकिन यह मेरे लिए जादू की तरह काम करता है। धन्यवाद @ मर्कग्रेनॉफ
फ्रेनकेल

11
    UIView *subview = ...;
    if([self.view.subviews containsObject:subview]) {
        ...
    }

काम नहीं करता है, बस उस पर दृश्य जोड़ता है। मैं वास्तविक मामले को दिखाने के लिए कोड को संपादित करूँगा - zad0xsis 1 मिनट पहले संपादित करें
pmerino

12
@pmerino आपको उस आलसी होने के लिए बधाई देता है कि आपने "zad0xsis 1 मिनट पहले संपादित किया था" :-) :-)
थॉमस केकेन

मुझे लगता है कि यह ईमानदार होने के लिए अन्य समाधानों की तुलना में अधिक महंगा है, क्योंकि इसमें सभी
साक्षात्कारों के

4

स्विफ्ट समकक्ष कुछ इस तरह दिखाई देगा:

if(!myView.isDescendantOfView(self.view)) {
    self.view.addSubview(myView)
} else {
    myView.removeFromSuperview()
}

2

सबव्यू के पर्यवेक्षक की जाँच करें ...

-(IBAction)showPopup:(id)sender {
    if([[self myView] superview] == self.view) { 
        [[self myView] removeFromSuperview];           
    } else {
        [self.view addSubview:[self myView]];         
    }
}

1

आपकी अगर हालत ऐसी होनी चाहिए

if (!([rootView subviews] containsObject:[self popoverView])) { 
    [rootView addSubview:[self popoverView]];
} else {
    [[self popoverView] removeFromSuperview];

}

यह माइकल फ्रेडरिक के उत्तर का एक मामूली संशोधन है। क्या यह विन्सेन्ट के कोड से भिन्न परिणाम देता है जो उपयोग करता है isDescendantOfView:?
पौलमेलिकोव

यह बिल्कुल अलग परिणाम देता है। यह केवल यह देखता है कि क्या यह एक बच्चे का दृश्य है, न कि किसी पोते या महान पोते, आदि का नहीं।
सामी संहिता

0

यहां हमने दो अलग-अलग विचारों का इस्तेमाल किया। पैरेंट दृश्य वह दृश्य है जिसमें हम वंशज दृश्य की खोज कर रहे हैं और माता-पिता के दृश्य में जोड़े गए वेदर चेक करें या नहीं।

if parentView.subviews.contains(descendantView) {
   // descendant view added to the parent view.
}else{
  // descendant view not added to the parent view.
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.