15

मान लें कि मेरे पास UINavigationController के भीतर एक स्टैक पर 2 UIViewControllers हैं। "पैरेंट" में हम "[self.navigationController pushViewController: childViewController एनिमेटेड: YES] कहते हैं;" कुछ उपयोगकर्ता कार्रवाई और "बच्चे" में हम "[self.navigationController popViewControllerAnimated: YES] कहते हैं;" कुछ उपयोगकर्ता कार्रवाई पर।आईओएस: कैसे पहचानें कि हमें अभिभावक UIViewController के भीतर एक बच्चे UIViewController से वापस मिला?

हम माता-पिता के भीतर कैसे पहचान सकते हैं कि हम अभी वापस आ गए हैं?

क्या कुछ "घटना" संचालित विधि है जो यह पहचान सकती है कि यह पॉपव्यू कंट्रोलर एनिमेटेड कार्रवाई बच्चे से बुलाया गया था?

उत्तर

0

पहले पढ़ें this, यह आपको समझने में मदद करेगा कि दृश्य नियंत्रकों के साथ क्या चल रहा है।

फिर संदेश पोस्ट करने के लिए अपने मूल दृश्य नियंत्रक में viewWillAppear: और viewDidAppear: लागू करें।

+1

यह आपको नहीं बताता है, हालांकि, कौन सा अन्य नियंत्रक पॉप किया गया है। कई अलग-अलग मौजूद हो सकते हैं। लेकिन एक धक्का वाले राज्य में एक समय में नहीं, इसलिए ओपी बस ट्रैक कर सकता है कि कौन सा नियंत्रक आखिरी बार धकेल दिया गया था। –

1

उस पर संकेत देने के कुछ तरीके हैं। आप क्या कर सकते हैं, पॉपव्यू कंट्रोलर को माता-पिता से एनीमेट किया गया है। आप बच्चे नियंत्रक को block पास करके ऐसा कर सकते हैं जो तब कहा गया ब्लॉक निष्पादित करेगा और इस प्रकार पॉपिंग माता-पिता नियंत्रक द्वारा किया जाएगा।

तुम भी UINavigationController प्रतिनिधि उपयोग कर सकते हैं सूचना भेजता है जब एक UIViewController खारिज कर दिया जाएगा:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated; 

इस विधि दूँगी तुम्हें पता है जो कुलपति दिखाया जाएगा और आप देख सकते हैं कि वर्तमान (अभी तक नहीं popped) वीसी वह बच्चा है जिसे आप ढूंढ रहे थे।

आप कुछ चाल भी कर सकते हैं - (शून्य) viewWillAppear: लेकिन इसके लिए कुछ हैक्स की आवश्यकता हो सकती है।

6

ऐसा लगता है कि आप इस बच्चे नियंत्रक को एक मोडल के रूप में उपयोग कर रहे हैं जिसमें इसे 'खारिज कर दिया जा सकता है'। यदि ऐसा है, तो ऐप्पल के पैटर्न का पालन करने का प्रयास करें जो वे UIAlertViews के लिए उपयोग करते हैं।

यदि ऐसा है, तो मैं एक प्रतिनिधि पैटर्न को लागू करने के लिए निम्न में से कोई एक करता हूं (प्रतिनिधि बनाम ब्लॉक एक बड़ी बहस है जिसे मैं यहां नहीं लाऊंगा) तो मालिक (वह जिसने बच्चे को धक्का दिया) जानता है जब अपने को खारिज कर दिया:

  • एक प्रोटोकॉल (ChildControllerDelegate) बनाएं, उस में एक विधि childControllerWasDismissed है: (ChildController *)
  • एक ब्लॉक संपत्ति जोड़ने (यकीन है कि इसकी एक प्रति संपत्ति बनाने के लिए, अपने पास नहीं) के लिए चाइल्डकंट्रोलर

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

3

मैं navigationController?.delegate = self सेट करके इसे सफलतापूर्वक हल कर दूंगा और फिर यह निर्धारित करने के लिए इस विधि को कार्यान्वित करूँगा कि वर्तमान दृश्य नियंत्रक पॉप के बाद फिर से दिखाया गया है या नहीं।

func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController == self { 
      // we got back 
     } else { 
      // some other controller was pushed 
     } 
    } 
संबंधित मुद्दे