2014-06-19 5 views
5

मेरे पास दो कक्षाएं हैं और एक बटन दबाए जाने पर एक वर्ग से एक विधि कॉल करना चाहते हैं। मैं के रूप में तो मेरे ज फाइल में यह घोषणा:किसी अन्य UIViewController से कॉलिंग विधि का कोई दृश्य प्रभाव नहीं है

-(void) imageChange; 

और मैं इस तरह मेरे मीटर में विधि बनाया:

-(void)imageChange { 
    UIImage *image = [UIImage imageNamed: img]; 
    [_MyImage setImage:image]; 
} 

अंत में, मैं का उपयोग कर किसी अन्य वर्ग से विधि कॉल करने की कोशिश की:

- (IBAction)Done:(id)sender { 

    SecondViewController *theInstance = [[SecondViewController alloc] init]; 
    [theInstance imageChange]; 
    [self dismissViewControllerAnimated:YES completion:nil]; 

} 

हालांकि, दबाएँ जब मैं "किया" मेरे विचार नियंत्रक में, UIImage नहीं बदलता है। कृपया ध्यान दें: img एक NSString मान है।

+0

आप एक नया 'SecondViewController' बना रहे हैं और इसकी छवि बदल रहे हैं। यह व्यर्थ है। आपको मौजूदा 'द्वितीय दृश्य नियंत्रक' के संदर्भ की आवश्यकता है और इसकी छवि बदलनी है। – rmaddy

+0

@rmaddy मुझे किस कोड को बदलना चाहिए? –

+0

@ user3750491, यह एक बदलाव के रूप में इतना बदलाव नहीं है: क्या SecondViewController इस दृश्य नियंत्रक को प्रस्तुत किया? – danh

उत्तर

8

सवाल एक आम एक पर एक भिन्नता है: "कैसे दृश्य नियंत्रकों के बीच मानों के बारे", और अपने कोड एक समाधान पर एक आम प्रयास का प्रतिनिधित्व करता है। आइए आपने जो किया उसके साथ शुरू करें।

आपके ऐप में दृश्य स्टैक पर विचारों के साथ दो दृश्य नियंत्रक हैं, और आप उनके बीच कुछ संवाद करना चाहते हैं। यह पंक्ति:

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 छवि पर स्वयं को कॉल कर सकते हैं।

आशा है कि पर्याप्त स्पष्ट था। सौभाग्य।

+0

कमाल की व्याख्या! सबके लिए धन्यवाद! आपने धमाल मचाया! –

+2

आपको बहुत धन्यवाद, आपने अभी अपना दिन बनाया है! यह मेरा 14 वां जन्मदिन है, इस विशेष उपहार के लिए धन्यवाद जिसने मुझे उस बग को ठीक करने में मदद की जो मुझे इतनी देर तक परेशान कर रहा था! –

संबंधित मुद्दे