मैं एक बड़े, उत्पादन के लिए तैयार स्विफ्टयूआई ऐप के लिए आर्किटेक्चर करने की कोशिश करता हूं। मैं हर समय उसी समस्या में चल रहा हूं जो स्विफ्टयूआई में एक प्रमुख डिजाइन दोष की ओर इशारा करती है।
फिर भी कोई भी मुझे पूरी तरह से काम करने, उत्पादन के लिए तैयार जवाब नहीं दे सका।
पुन: प्रयोज्य दृश्य कैसे करें SwiftUIजिसमें नेविगेशन शामिल है?
जैसा कि SwiftUI NavigationLinkदृढ़ता से यह देखने के लिए बाध्य है कि यह केवल इस तरह से संभव नहीं है कि यह बड़े एप्स में भी हो। NavigationLinkउन छोटे नमूना ऐप्स में काम करता है, हाँ - लेकिन जैसे ही आप एक ऐप में कई दृश्यों का पुन: उपयोग करना चाहते हैं। और शायद मॉड्यूल सीमाओं पर भी पुन: उपयोग। (जैसे: आईओएस, वॉचओएस, आदि में पुन: उपयोग करना ...)
डिज़ाइन की समस्या: नेवीगेशनलिंक को व्यू में हार्डकोड किया गया है।
NavigationLink(destination: MyCustomView(item: item))
लेकिन अगर इस दृश्य को NavigationLinkपुन: प्रयोज्य किया जाना चाहिए तो मैं गंतव्य को हार्डकोड नहीं कर सकता । एक तंत्र होना चाहिए जो गंतव्य प्रदान करता है। मैंने इसे यहाँ पूछा और काफी अच्छा जवाब मिला, लेकिन अभी भी पूरा जवाब नहीं मिला:
SwiftUI MVVM समन्वयक / राउटर / नेविगेशनलिंक
विचार गंतव्य लिंक को पुन: प्रयोज्य दृश्य में इंजेक्ट करने का था। आम तौर पर यह विचार काम करता है लेकिन दुर्भाग्य से यह वास्तविक उत्पादन एप्स के लिए नहीं है। जैसे ही मेरे पास कई पुन: प्रयोज्य स्क्रीन हैं मैं तार्किक समस्या में चला जाता हूं कि एक पुन: प्रयोज्य दृश्य ( ViewA) को पूर्व-निर्धारित दृश्य-गंतव्य ( ViewB) की आवश्यकता होती है। लेकिन क्या होगा अगर ViewBएक पूर्वनिर्मित दृश्य-गंतव्य की भी आवश्यकता है ViewC? मैं बनाने के लिए की आवश्यकता होगी ViewBइस तरह से कि में पहले से ही ViewCपहले से ही में इंजेक्ट किया जाता है ViewBइससे पहले कि मैं इंजेक्षन ViewBमें ViewA। और इसी तरह .... लेकिन जैसा कि उस समय जो डेटा पास करना है वह उपलब्ध नहीं है, पूरा निर्माण विफल है।
मेरे पास एक और विचार था कि Environmentगंतव्य के लिए इंजेक्शन लगाने के लिए निर्भरता इंजेक्शन तंत्र का उपयोग किया जाए NavigationLink। लेकिन मुझे लगता है कि इसे कम या ज्यादा हैक के रूप में माना जाना चाहिए न कि बड़े ऐप्स के लिए स्केलेबल समाधान। हम पर्यावरण को मूल रूप से हर चीज के लिए इस्तेमाल करेंगे। लेकिन क्योंकि पर्यावरण का उपयोग केवल व्यूज़ के अंदर ही किया जा सकता है (अलग कोऑर्डिनेटरों या ViewModels में नहीं) यह फिर से मेरी राय में अजीब निर्माण करेगा।
व्यापार तर्क की तरह (उदाहरण के लिए मॉडल कोड) और दृश्य को भी अलग करना होगा नेविगेशन और दृश्य को अलग करना होगा (जैसे समन्वयक पैटर्न) UIKitयह संभव है क्योंकि हम देखने के लिए UIViewControllerऔर UINavigationControllerपीछे पहुंचते हैं। UIKit'sएमवीसी के पास पहले से ही यह समस्या थी कि वह इतनी अवधारणाओं को मिटा देता था कि वह "मॉडल-व्यू-कंट्रोलर" के बजाय मजेदार नाम "मैसिव-व्यू-कंट्रोलर" बन जाता था। अब इसी तरह की समस्या जारी है, SwiftUIलेकिन मेरी राय में इससे भी बदतर। नेविगेशन और दृश्य दृढ़ता से युग्मित होते हैं और इन्हें डिकोड नहीं किया जा सकता है। इसलिए यदि उनके पास नेविगेशन है तो पुन: प्रयोज्य दृश्य करना संभव नहीं है। इसे हल करना संभव था, UIKitलेकिन अब मैं इसमें एक समाधान नहीं देख सकताSwiftUI। दुर्भाग्य से Apple ने हमें इस तरह की वास्तु संबंधी समस्याओं को हल करने के लिए स्पष्टीकरण नहीं दिया। हमें सिर्फ कुछ छोटे सैंपल एप्स मिले।
मैं गलत साबित होना पसंद करूंगा। कृपया मुझे एक साफ ऐप डिज़ाइन पैटर्न दिखाएं जो बड़े उत्पादन के लिए तैयार ऐप्स के लिए इसे हल करता है।
अग्रिम में धन्यवाद।
अद्यतन: यह इनाम कुछ ही मिनटों में समाप्त हो जाएगा और दुर्भाग्य से अभी भी कोई भी काम करने का उदाहरण देने में सक्षम नहीं था। लेकिन मैं इस समस्या को हल करने के लिए एक नया इनाम शुरू करूंगा अगर मुझे कोई अन्य समाधान नहीं मिल रहा है और इसे यहां लिंक कर सकता हूं। उनके महान योगदान के लिए सभी को धन्यवाद!