2011-12-21 25 views
6

मेरे ऐप में, मेरे पास लगभग एक दर्जन अलग-अलग दृश्य नियंत्रक हैं, जो विभिन्न ऑर्डर में स्टैक से धक्का या पॉप किए गए हैं। जब कोई दृश्य दिखाई देता है (मैं viewDidAppear विधि का उपयोग कर रहा हूं) मुझे यह निर्धारित करने की आवश्यकता है कि ऐसा इसलिए है क्योंकि यह दृश्य अभी स्टैक पर धकेल दिया गया है या क्योंकि इसके सबव्यूव में से एक स्टैक से पॉप किया गया था।UIViewController viewDidAppear - क्योंकि इसे धक्का दिया गया था या क्योंकि सबव्यू पॉप पॉप किया गया था?

मैं इस सवाल माध्यम से चला गया: viewWillDisappear: Determine whether view controller is being popped or is showing a sub-view controller

लेकिन मुझे नहीं लगता कि यह मेरे बहुत ज्यादा मदद कर रहा है या नहीं। कोई सुझाव कृपया?

उत्तर

1

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

फिर जब कोई सबव्यू व्यू कंट्रोलर पॉप-अप होता है तो ViewDidAppear विधि यह देखने के लिए जांच करेगी कि पहले से ही सुरक्षित संपत्ति सत्य पर सेट है या नहीं, अगर आपको पता है कि एक सबव्यू अभी पॉप अप हो गया है।

+0

धन्यवाद, यह सबसे आसान दृष्टिकोण प्रतीत होता है। –

0

एक दृश्य नियंत्रक ढेर पर धकेल दिया जाता है, यह viewDidLoad विधि बुलाया जाएगा है; यदि यह उप-नियंत्रक पॉप किया गया है, तो viewDidLoad नहीं कहा जाता है।

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    //do any setup you want to do only when the view is pushed onto the 
    //stack for the first time; this method will not be called 
    //when the view's subview is popped and this one becomes visible 
} 

तो, viewDidLoad का उपयोग (या initWithNibName, पर निर्भर करता है कि आप क्या कर रहे हैं) एक बार सेटअप जब दृश्य नियंत्रक पहली बार के लिए धक्का दिया है, और viewDidAppear कि आप हर क्या करना चाहते हैं सेटअप के लिए के लिए समय दृश्य दिखाई देता है।

- (void)navigationController:(UINavigationController *)navigationController 
    willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
    [viewController viewWillAppear:animated]; 
    //do any every-time setup *before* the view is shown 
} 

- (void)navigationController:(UINavigationController *)navigationController 
    didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
    [viewController viewDidAppear:animated]; 
    //do any every-time setup *after* the view is shown 
} 
+5

यह मानना ​​सुरक्षित नहीं है कि प्रत्येक बार व्यू कंट्रोलर को व्यू कंट्रोलर में जोड़ा जाने पर '-viewDidLoad'' कहा जाएगा। एक व्यू कंट्रोलर का उपयोग पहले से ही किया जा सकता है, और कुछ बिंदु पर जिस तरह से इसका दृश्य भी बनाया जा सकता है। वह तब होता है जब '-viewDidLoad' कहा जाएगा। उसके बाद, दृश्य पहले ही लोड हो चुका है, और विधि को सिर्फ इसलिए नहीं कहा जाएगा क्योंकि नियंत्रक को ढेर पर धक्का दिया जाता है। – Caleb

+0

बहुत अच्छा मुद्दा।हालांकि, ऐसा लगता है कि यह मामला यहां नहीं है। ओपी ने व्यू कंट्रोलर के प्री-कैशिंग के बारे में कुछ भी नहीं बताया। –

+1

@ कैलेब: यह एक बहुत अच्छा मुद्दा है, खासकर मेरे मामले में। चूंकि दृश्य नियंत्रकों को धक्का दिया जाता है और स्टैक पर पॉप किया जाता है, जब मैं नियंत्रक पॉप करता हूं, तो मैं इसे नष्ट नहीं करता हूं, लेकिन इसे बाद में पुन: उपयोग करने की आवश्यकता होती है जब मुझे इसे फिर से धक्का देना पड़ता है। –

4

सबसे अच्छा समाधान, यदि आप इसे प्रबंधन कर सकते हैं, इतना है कि यह है कि क्या कोई फर्क नहीं पड़ता अपने कोड को संशोधित करने की कोशिश करने के लिए है: UINavigationController के साथ, आप UINavigationControllerDelegate प्रोटोकॉल में इन दोनों तरीकों को लागू करने के लिए चाहते हो सकता नियंत्रक को धक्का दिया गया था या उसका बच्चा बस पॉप किया गया था। मूल रूप से, एक व्यू कंट्रोलर अपने दृश्य और ऐप पर चलने वाले डेटा के बीच मध्यस्थता करता है। जब तक कि डेटा अद्यतित हो, तब तक नियंत्रक को इसके विचार से पहले क्या हो रहा था इसके बारे में चिंतित नहीं होना चाहिए। कार्य जो आपका नियंत्रक वर्तमान में ऐप की पिछली स्थिति के आधार पर करता है, जैसे डेटा अपडेट करना, वास्तव में एक अलग वर्ग में बेहतर हो सकता है।

एक और संभावना, यदि आप स्टोरीबोर्ड का उपयोग कर रहे हैं, तो -viewDidAppear के बजाय -prepareForSegue:sender: पर भरोसा करना है। उस विधि में आपके द्वारा पारित सीगू में गुण हैं जो स्रोत और गंतव्य दृश्य नियंत्रकों की पहचान करते हैं, और यह आमतौर पर आपको यह बताने के लिए पर्याप्त जानकारी होती है कि आपका नियंत्रक वर्तमान कैसे होता है।

यदि आपके मामले में उन कार्यों में से कोई भी नहीं, तो अपने कॉन्फ़िगरेशन कोड को एक या अधिक विभिन्न तरीकों से ले जाने पर विचार करें। जिस समस्या का आप सामना कर रहे हैं उसकी जड़ यह है कि -viewWillAppear वास्तव में इसका मतलब यह नहीं है कि आपको इसकी क्या आवश्यकता है। एक विधि है कि मतलब है कि तुम क्या जरूरत है, -childControllerFinished की तरह, और कहा किका उपयोग विन्यास काम है कि आप की जरूरत है ऐसा करने के लिए बनाएँ।

संबंधित मुद्दे

 संबंधित मुद्दे