सवाल एक आम एक पर एक भिन्नता है: "कैसे दृश्य नियंत्रकों के बीच मानों के बारे", और अपने कोड एक समाधान पर एक आम प्रयास का प्रतिनिधित्व करता है। आइए आपने जो किया उसके साथ शुरू करें।
आपके ऐप में दृश्य स्टैक पर विचारों के साथ दो दृश्य नियंत्रक हैं, और आप उनके बीच कुछ संवाद करना चाहते हैं। यह पंक्ति:
SecondViewController *theInstance = [[SecondViewController alloc] init];
एक ब्रांड के नए SecondViewController के कहने बनाता है (alloc इस वर्ग का एक नया उदाहरण के लिए स्मृति को आबंटित का मतलब है)। यह पंक्ति:
[theInstance imageChange];
कुछ ऐसा करने के लिए संचार करता है, आपके मामले में यह एक छवि दृश्य की छवि सेट करने जैसा दिखता है। फिर यह पंक्ति:
}
उस नए उदाहरण को पूरी तरह से नष्ट कर देता है, क्योंकि इसे कभी भी संदर्भित नहीं किया जाता है। तो आपका कोड सेकेंड व्यू कंट्रोलर के साथ संवाद करने में सफल होता है, लेकिन गलत उदाहरण के साथ, एक उदाहरण जो केवल कुछ मिलीसेकंड के लिए रहता है।
ठीक है, इसके बारे में क्या करना है? @rmaddy क्या कह रहा था, SecondViewController का मौजूदा उदाहरण ढूंढें, और इसके साथ संवाद करें। उस मौजूदा उदाहरण को कैसे प्राप्त किया जाए इस पर निर्भर करता है कि हम यहां कैसे पहुंचे। DismissCiewController आपके कोड में एनिमेटेड मुझे लगता है कि यह वर्तमान वीसी सेकेंडवीसी के उदाहरण द्वारा प्रस्तुत किया गया था। यदि हां, तो आप क्या जरूरत के लिए
(SecondViewController *)self.presentingViewController
अंक। जबकि सभी कि बी करने के लिए एक से straightest लाइन हो सकता है, यह बहुत अच्छा डिजाइन नहीं है, क्योंकि यह इस वर्तमान बनाता
NSArray *stack = self.navigationController.viewControllers;
SecondViewController *secondVC = stack[stack.count-2];
लेकिन,: यदि हम एक UINavigationController
में थे, तो आप के माध्यम से यह viewControllers
ढेर, शायद यहाँ है खुदाई कर सकता है नियंत्रक को एक भंगुर तरीके से निर्भर करता है कि यह कैसे प्रस्तुत किया गया है।
इसलिए @CrimsonChris प्रतिनिधिमंडल पर विचार करने के लिए एक अच्छा सुझाव देता है। यह एक कुलपति दूसरे के साथ संवाद करने की जरूरत है कि के लिए सबसे अधिक लोगों के जाने के लिए पैटर्न है। ऐसा करने के तरीके पर वेब और एसओ संसाधनों के बहुत सारे हैं, इसलिए मैं यहाँ दोहराना नहीं होगा। Check out this, for example, या गूगल "आईओएस प्रतिनिधिमंडल"।
अन्य तरीके, NSNotificationCenter
की तरह हर किसी को दिलचस्पी रखता है जो कुछ भी आप संवाद करने के लिए या SecondVC अपने मॉडल में बदलाव का निरीक्षण करने और प्रतिक्रिया, चाहे कितना या क्यों कि बदलाव किया गया था देता है कि चाहते हैं, KVO को प्रसारित करने के लिए कर रहे हैं।
इन बाद के दो के लिए महत्वपूर्ण अवधारणा यह है कि आपके ऐप को एक मॉडल, ऑब्जेक्ट का एक सेट होना चाहिए जो ऐप स्थिति का वर्णन करता हो। दृश्य नियंत्रक मॉडल नहीं हैं - असल में वे बिल्कुल मॉडल नहीं हैं। उनका काम मॉडल परिवर्तनों के बारे में जानना और तदनुसार विचारों को संशोधित करना है।
आपके मामले के लिए, आपके द्वारा पोस्ट किया गया कोड अन्य दृश्य नियंत्रक में एक छवि सेट प्राप्त करने की कोशिश नहीं कर रहा है, इसे मॉडल में रिकॉर्ड करना चाहिए जो कि उपयोगकर्ता की कार्रवाई जो भी हो, जो बर्खास्तगी को ट्रिगर करता है। जब यह वर्तमान वीसी स्वयं को खारिज कर देता है, तो दूसरा दृश्य नियंत्रक (यह मानते हुए कि यह वर्तमान में हुआ) एक दृश्य विल्लएपियर प्राप्त करेगा। उपयोगकर्ता विधि पर सेट की गई मॉडल स्थिति की जांच करने के लिए यह विधि एक अच्छी जगह हो सकती है। फिर SecondViewController छवि पर स्वयं को कॉल कर सकते हैं।
आशा है कि पर्याप्त स्पष्ट था। सौभाग्य।
आप एक नया 'SecondViewController' बना रहे हैं और इसकी छवि बदल रहे हैं। यह व्यर्थ है। आपको मौजूदा 'द्वितीय दृश्य नियंत्रक' के संदर्भ की आवश्यकता है और इसकी छवि बदलनी है। – rmaddy
@rmaddy मुझे किस कोड को बदलना चाहिए? –
@ user3750491, यह एक बदलाव के रूप में इतना बदलाव नहीं है: क्या SecondViewController इस दृश्य नियंत्रक को प्रस्तुत किया? – danh