iOS में स्क्रीन के बीच डेटा ट्रांसफर: शुरुआत से विशेषज्ञ तक
\n\nजिसने भी iOS के लिए कोडिंग शुरू की, वह देर-सबेर एक दीवार से टकराया: "मैं दूसरी स्क्रीन पर एक स्ट्रिंग, ऐरे या ऑब्जेक्ट कैसे भेजूं?" यह सवाल इतना लोकप्रिय है कि Stack Overflow पर इसके हज़ारों व्यू और दर्जनों जवाब हैं। और यह कोई संयोग नहीं है — iOS की आर्किटेक्चर इस तरह बनी है कि हर स्क्रीन (ViewController) अपनी जिंदगी जीती है, और उनके बीच डेटा को जानबूझकर ट्रांसफर करना पड़ता है।
\n\nइस लेख में हम Swift पर view controllers के बीच डेटा ट्रांसफर करने के 5 मुख्य तरीकों पर चर्चा करेंगे। आप जानेंगे कि कब segue का उपयोग करना है, और कब delegates या closures का, और क्यों NotificationCenter हमेशा बुरा नहीं है। चलिए शुरू करते हैं!
\n\nयह समस्या क्यों है?
\niOS सख्त MVC (Model-View-Controller) आर्किटेक्चर का उपयोग करता है। प्रत्येक ViewController अपने स्क्रीन के हिस्से के लिए जिम्मेदार है और पड़ोसी कंट्रोलर के डेटा तक सीधी पहुंच नहीं रखता। यह सुरक्षा और मॉड्यूलरिटी के लिए किया गया है, लेकिन डेवलपर के लिए इसका मतलब है कि डेटा को बिंदु A से बिंदु B तक स्पष्ट रूप से "खींचना" होगा।
\n\nकल्पना करें: आपके पास उपयोगकर्ताओं की एक सूची है, और आप एक सेल पर क्लिक करने पर विस्तृत जानकारी दिखाना चाहते हैं। आप क्लिक करते हैं — एक नई स्क्रीन खुलती है। उपयोगकर्ता ID कैसे ट्रांसफर करें? यहीं से जादू शुरू होता है।
\n\nतरीका 1: Storyboard Segue के माध्यम से डेटा ट्रांसफर (सबसे आसान)
\nसबसे सीधा तरीका prepare(for:sender:) का उपयोग करना है। आप ट्रांज़िशन से पहले डेटा तैयार करते हैं। सरल ऐप्स और प्रोटोटाइप के लिए आदर्श।
// मूल ViewController में\noverride func prepare(for segue: UIStoryboardSegue, sender: Any?) {\n if segue.identifier == "showDetail" {\n guard let destinationVC = segue.destination as? DetailViewController else { return }\n destinationVC.userID = 42 // संख्या ट्रांसफर करें\n destinationVC.userName = "Анна" // स्ट्रिंग ट्रांसफर करें\n }\n}\n\n// DetailViewController में\nvar userID: Int = 0\nvar userName: String = ""\n\n\nलाभ: न्यूनतम कोड, सब कुछ एक जगह। नुकसान: Storyboard से कठोर जुड़ाव, परीक्षण करना मुश्किल, आइडेंटिफ़ायर में भ्रम हो सकता है।
\n\nतरीका 2: प्रोग्रामेटिक नेविगेशन डेटा ट्रांसफर के साथ (उन्नत स्तर)
\nजब आप segues से थक जाते हैं और कोड से सब कुछ नियंत्रित करना चाहते हैं, तो कंट्रोलर का सीधा इंस्टेंस उपयोग करें।
\n\n// मूल ViewController में\nfunc showDetail() {\n let storyboard = UIStoryboard(name: "Main", bundle: nil)\n guard let detailVC = storyboard.instantiateViewController(withIdentifier: "DetailVC") as? DetailViewController else { return }\n \n detailVC.userID = 42\n detailVC.userName = "Анна"\n \n navigationController?.pushViewController(detailVC, animated: true)\n}\n\n\nयह तरीका पूर्ण नियंत्रण देता है: आप नेटवर्क से डेटा लोड कर सकते हैं, उसकी जांच कर सकते हैं और फिर ट्रांज़िशन कर सकते हैं। जटिल लॉजिक के लिए बढ़िया।
\n\nतरीका 3: Delegates (Delegate Pattern) — प्रतिक्रिया
\nक्या होगा अगर डेटा वापस ट्रांसफर करना हो? उदाहरण के लिए, उपयोगकर्ता ने दूसरी स्क्रीन पर एक तारीख चुनी, और हम इसे पहली स्क्रीन पर वापस लाना चाहते हैं। यहाँ delegate मदद करता है।
\n\nचरण 1: प्रोटोकॉल बनाएं
\nprotocol DatePickerDelegate: AnyObject {\n func didSelectDate(_ date: Date)\n}\n\n\nचरण 2: चाइल्ड कंट्रोलर में delegate जोड़ें
\nclass DatePickerViewController: UIViewController {\n weak var delegate: DatePickerDelegate?\n \n @IBAction func saveButtonTapped(_ sender: UIButton) {\n let selectedDate = datePicker.date\n delegate?.didSelectDate(selectedDate)\n dismiss(animated: true)\n }\n}\n\n\nचरण 3: पैरेंट कंट्रोलर में delegate लागू करें
\nclass MainViewController: UIViewController, DatePickerDelegate {\n func didSelectDate(_ date: Date) {\n print("प्राप्त तारीख: \\(date)")\n // UI अपडेट करें\n }\n \n override f