10

मैं कैसे जांचूं कि UIViewController वर्तमान में प्रदर्शित किया जा रहा है या नहीं?मैं कैसे जांचूं कि एक UIViewController वर्तमान में प्रदर्शित किया जा रहा है या नहीं?

मेरा UIViewControllersNSNotifications के लिए सुन रहे हैं - भले ही वे प्रदर्शित नहीं होते हैं (यानी नहीं दिखाया गया)। तो NSNotificationCenter से NSNotifications देखकर पृष्ठभूमि में 10 UIViewController हो सकता है। जब NSNotificationUIViewController द्वारा पोस्ट और प्राप्त किया गया है, तो मैं यह जानना चाहता हूं कि यह वर्तमान में दिखाया जा रहा है या नहीं। यदि ऐसा नहीं है, तो मैं बस एक बुलियन सेट करूंगा ताकि दृश्य प्रस्तुत होने पर यह संसाधित हो सके। यदि वर्तमान में यह प्रदर्शित हो रहा है, तो मैं तुरंत अपडेट टेबल जैसे और अधिक काम करूंगा, और आगे ...

+0

आप व्यू कंट्रोलर के दृश्य को कैसे प्रस्तुत कर रहे हैं? – tdubik

+0

@tdubik: पारंपरिक तरीका, जैसे pushViewController। मैं स्टोरीबोर्ड या सीग्स का उपयोग नहीं कर रहा हूं। – ikevin8me

+0

ऐसे मामले में आप 'UINavigationController' कक्षा से 'शीर्ष दृश्य नियंत्रक' की जांच कर सकते हैं। या यदि आप अधिक प्रक्रिया करना चाहते हैं तो एक नियंत्रक 'viewControllers' सरणी' गणना करें। – tdubik

उत्तर

13

आप अगर जांच करने की आवश्यकता आपका व्यू कंट्रोलर नेविगेशन कंट्रोलर के व्यू कंट्रोलर सरणी के ढेर के शीर्ष पर है। एक नमूना कोड

if (self.navigationController.topViewController == self) { 
    //the view is currently displayed 
} 

वर्तमान दृश्य दिखाई दे रहा है कि क्या जांच करने के लिए viewWillAppear विधि के अंदर इसका उपयोग कर सकते है।

+1

@ डीबीडी का उत्तर एक और सामान्य है और चूंकि प्रश्न शीर्षक विशिष्ट नहीं है, भविष्य के पाठकों के लिए और अधिक सहायक होगा। – Zedenem

1

आप दृश्य में श्रोता श्रोता को क्यों नहीं हटाते हैं और इसे दृश्य में जोड़ते हैं?

संपादित करें: क्षमा करें, उसके प्रश्न को गलत तरीके से पढ़ें।

सुझाए गए उत्तर: दृश्य में अपना स्वयं का ध्वज (BOOL) सेट करेंडिडिसर और देखेंडिडएपियर।

+0

यह काम नहीं करेगा क्योंकि यह हटाए जाने पर सभी अधिसूचनाओं को याद करेगा। – ikevin8me

+0

फिर दृश्य में एक ध्वज (BOOL) सेट करने के बारे में क्या दृश्य दिखाई देने के लिए दृश्य दिखाई नहीं देता है। जब यह अधिसूचना प्राप्त करता है, तो यह देखने के लिए ध्वज जांचें कि दृश्य दृश्यमान है या नहीं। – yuf

+0

अगर अधिसूचना आती है तो मुझे तालिका को फिर से लोड करने की आवश्यकता होगी। यदि यह नहीं आता है, तो ऐसा करना बहुत महंगा है। इसके अलावा, दृश्य को फिर से प्रकट होने पर तालिका को फिर से लोड करने की कोई आवश्यकता नहीं है: डेटा समान और बहुत महंगा है। – ikevin8me

0

मुझे लगता है कि viewController.view.superview की जांच करना चाहिए।

+0

मैं वास्तव में समझ में नहीं आता। आप तुलना कैसे करते हैं? – ikevin8me

+0

'if (viewController.view.superview! = Nil)' – tdubik

+0

समस्या यह है कि, आपका दृश्य पर्यवेक्षण से जुड़ा जा सकता है, लेकिन उस पर्यवेक्षण को आपकी खिड़की से जोड़ा नहीं जा सकता है, इसलिए एक संभावित छेड़छाड़ है जहां यह काम नहीं करेगी । – DBD

6

यह देखने के लिए जांचें कि यह विंडो से जुड़ा हुआ है या नहीं। यदि यह nil नहीं है यह (बेशक, यह स्क्रीन की सीमा से बंद हो सकता है कुछ अन्य दृश्य के अंतर्गत आने वाले या छिपा ध्वज सेट है), जो स्क्रीन से जुड़ा हुआ है पदानुक्रम में है

if (myViewController.view.window) { 
    // I'm attached to the window 
} else { 
    // not attached to the window 
} 
+1

बंद करें, लेकिन आपको यह जांचना चाहिए कि दृश्य विंडो में है या नहीं, यह देखने से पहले दृश्य लोड किया गया है: 'अगर (self.isViewLoaded && self.view.window! = Nil) ... ' –

+0

@rob। हाँ आप सही हैं। यदि व्यू कंट्रोलर लोड नहीं होता है और आप 'व्यू' ऑब्जेक्ट तक पहुंचते हैं, तो आप आलसी लोडिंग का कारण बनेंगे जिसका मतलब है कि चीजों को स्मृति में लोड करना, आप वास्तव में उपयोग करने के लिए तैयार नहीं हैं। हालांकि यह अभी भी सही उत्तर देगा, यह आदर्श प्रदर्शन से कम उपस्थित होगा। मैंने धारणा की थी कि दृश्य लोड होने पर अधिसूचना केवल तभी जोड़ा जाएगा, प्रारंभिक नहीं, क्योंकि एक प्रारंभिक दृश्य कभी भी संलग्न नहीं होगा। फिर भी यह संभवतः एक अनुचित धारणा थी और एक जिसे कुछ भी नहीं बताया जाना चाहिए था। – DBD

+0

यह वास्तव में सही जवाब होना चाहिए, @ robmayoff के परिवर्तन एकीकृत के साथ। – Bill

4

आप इसके लिए viewWillAppear और viewWillDisappear विधियों में झंडे का उपयोग कर सकते हैं।

1

प्रत्येक व्यू कंट्रोलर को शीर्षक निर्दिष्ट करें और फिर दिए गए कोड द्वारा वर्तमान व्यू कंट्रोलर का शीर्षक प्राप्त करें।

NSString *currentController = self.navigationController.visibleViewController.title; 

Then check it by your title like this 

if([currentController isEqualToString:@"myViewControllerTitle"]){ 

    //write your code according to View controller. 

}