मैं निम्नलिखित मुद्दे से जूझ रहा हूं:

मेरे पास एक ViewController और एक अलग UIView जुड़ा हुआ है जिसका उपयोग मैं स्टोरीबोर्ड या xib/nib के बजाय करता हूं, जिसका अर्थ है कि मैंने "ड्राइंग विचारों को प्रोग्रामिक रूप से" दृष्टिकोण लिया।

class MyViewControllerA: UIViewController {
override func loadView() { 
        self.view = MyViewControllerAView()
    }
}

उपरोक्त सब ठीक काम करता है।

फिर मेरे भीतर MyViewControllerAView मैं एक तृतीय पक्ष UI घटक का उपयोग कर रहा हूं जो एक प्रतिनिधि का उपयोग करके MyViewControllerA के भीतर दो UIViewControllers लोड करता है:

class MachineHomeView: UIView, ThirdPartyUIComponentDelegate {

        //code ...

        func thirdPartyUIComponent(_ thirdPartyUIComponent: ThirdPartyUIComponent, viewControllerAt index: UInt) -> UIViewController {
            switch index {
            case 0:
                return MyViewControllerC()
            case 1:
                return MyViewControllerC()
            //..more code
            }
        }
    }

और यूआई की तरह दिखता है:

enter image description here

संक्षेप में, मेरे पास एक ViewControllerA है जिसका View दो अतिरिक्त व्यू कंट्रोलर लोड करता है - ViewControllerB और ViewControllerC

जैसा कि आप देख रहे हैं कि मैं View और Controller को एक दूसरे से अलग करके MVC दृष्टिकोण का पालन करने का प्रयास कर रहा हूं।

समस्या मैं सामना कर रहा हूं कि मैं MyViewControllerA से MyViewControllerB और MyViewControllerC तक डेटा पास करना चाहता हूं।

पहली बात जो मेरे दिमाग में आती है वह है MyViewControllerAView में एक संपत्ति बनाना, जैसे test। तो viewWillLoad या viewDidLoad में मैं सामान पास कर सकता हूं जैसे:

self.view.test = "some data"

फिर उस प्रतिनिधि में जहां मैं दो अतिरिक्त दृश्य नियंत्रकों को तत्काल करता हूं जो मैं कर सकता हूं:

func thirdPartyUIComponent(_ thirdPartyUIComponent: ThirdPartyUIComponent, viewControllerAt index: UInt) -> UIViewController {
                switch index {
                case 0:
                     let myViewControllerB = MyViewControllerB()
                     myViewControllerB.someProperty = self.test
                    return myViewControllerB
                case 1:
               let myViewControllerC = MyViewControllerC()
                     myViewControllerC.someProperty = self.test
                    return myViewControllerC
                }
            }
        }

मेरे दिमाग में उपरोक्त तरीके से एमवीसी सम्मेलन तोड़ रहा है क्योंकि व्यू अब केवल यूआई जिम्मेदार नहीं है। इसलिए मैं इससे बचना चाहता हूं और एमवीसी को साफ रखना चाहता हूं।

एमवीसी पैटर्न को तोड़े बिना या खराब अभ्यास शुरू किए बिना MyViewControllerA से MyViewControllerB और MyViewControllerC तक डेटा कैसे पास करें, इसका कोई विचार?

2
radioaktiv 10 अक्टूबर 2017, 14:17

2 जवाब

सबसे बढ़िया उत्तर

मेरा मानना ​​है कि आपको इस समस्या से निम्नलिखित तरीके से संपर्क करना चाहिए।

thirdPartyUIComponent(_:) विधि को MyViewControllerAView से MyViewControllerA में ले जाएं - मुझे नहीं लगता कि यह एमवीसी में दृश्य नियंत्रकों को तुरंत चालू करने और संभालने के लिए उपयुक्त है। अब MyViewControllerA व्यू कंट्रोलर, व्यू कंट्रोलर B और C के लिए जिम्मेदार होगा।

फिर, चूंकि मुझे उम्मीद है कि आपको MyViewControllerAView में B और C के विचारों तक पहुंचने की आवश्यकता है, उन्हें सीधे MyViewControllerAView पर पास करें - हालांकि, केवल B के दृश्य पास करें B और C, न कि स्वयं दृश्य नियंत्रक।

इस तरह A व्यू कंट्रोलर, व्यू कंट्रोलर B और C को मैनेज करेगा, लेकिन MyViewControllerAView के पास अभी भी B.view और C.view तक पहुंच होगी। उन्हें ठीक से बिछाने के लिए।

पुनश्च: यदि MyViewControllerAView पर उपयोगकर्ता द्वारा कुछ UI कार्रवाई ट्रिगर होने पर thirdPartyUIComponent(_:) कॉलबैक कॉल किया जाना चाहिए, तो उस ईवेंट को पास करने के लिए प्रतिनिधि पैटर्न का उपयोग करें MyViewControllerA इसे सफाई से संभालने के लिए .

2
Milan Nosáľ 10 अक्टूबर 2017, 14:31

UView को UIViewControllers नहीं बनाना चाहिए और उन्हें स्वयं प्रबंधित करना चाहिए। ViewControllerA को ViewControllerB और ViewControllerC के प्रबंधन के लिए जिम्मेदार बनाएं। ऐसा करने का शानदार तरीका है ए के B और C चाइल्ड व्यू कंट्रोलर बनाना। आप प्रतिनिधि द्वारा A पैरेंट व्यू कंट्रोलर से संवाद कर सकते हैं। ऐप्पल ट्यूटोरियल इसे कैसे बनाएं: https://developer.apple.com/library/content/featuredarticles/ ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html

हालांकि @ मिलन समाधान भी ठीक है।

1
Jacek Głazik 10 अक्टूबर 2017, 14:50