2012-03-18 23 views
50

के साथ कंट्रोलर कस्टम इनिट विधि देखें मेरे स्टोरीबोर्ड में डिज़ाइन किए गए मेरे कस्टम व्यू कंट्रोलर के लिए प्रारंभिक विधि को ओवरराइड करने में मुझे परेशानी हो रही है।स्टोरीबोर्ड

अब (मेरे mainViewController में) कर रहा im:

self.customViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"CustomVC"]; 
self.customViewController.myObject = someObject; 

और मैं viewDidLoad (CustomViewController) में है

[self.label setText:self.myObject.someString]; 

यह ठीक काम करता है।

लेकिन, क्या यह सही तरीका है? क्या मुझे अपने कस्टम व्यू कंट्रोलर में एक कस्टम इनिट विधि (या ओवरराइड) जोड़नी चाहिए? InitWithObject की तरह:? मुझे नहीं पता कि UIStoryboard instantiateViewControllerWithIdentifier: के बजाय मेरी कस्टम इनिट विधि को कैसे कॉल करें, और मुझे init और न ही initWithNibName पर कॉल नहीं मिल रहा है।

शायद मुझे इसका उपयोग करना चाहिए: - (id)initWithCoder:(NSCoder *)decoder

कृपया मुझे कुछ सलाह दें!

धन्यवाद!

+0

आप कर रहे हैं सब ठीक है। आप कस्टम इडिट –

उत्तर

58

स्टोरीबोर्ड में दृश्य नियंत्रकों के लिए नामित प्रारंभकर्ता -initWithCoder: है। चूंकि स्टोरीबोर्ड से अधिकांश दृश्य नियंत्रक segues के माध्यम से बनाए जाते हैं, इसलिए आप आमतौर पर -prepareForSegue:sender: के दौरान राज्य सेट देखते हैं।

यदि आप सीधे प्रदान किए गए उदाहरण में स्टोरीबोर्ड से दृश्य नियंत्रक को तत्काल कर रहे हैं, तो आपके द्वारा चुने गए पैटर्न उचित हैं।

+0

करने के लिए अपने _customViewController ऑब्जेक्ट की क्लास फ़ाइल को अपनी कस्टम क्लास में initWithCoder को ओवरराइड कर सकते हैं। –

+2

यह एक बहुत ही खराब डिज़ाइन है, क्योंकि इससे आप विकल्प को त्वरित (साथ!?) में उपयोग कर सकते हैं या यदि संभव हो तो डेवलपर सही चर सेट करना भूल जाता है। यह दुखद है कि यह "उपयुक्त" समाधान है: इस मुद्दे पर तेजी से/उद्देश्य सी वैकल्पिक के साथ एक अच्छा स्रोत: http://www.objc.io/issue-16/power-of-swift.html –

+0

बस जवाब देने के लिए @GuilhermeSilveira टिप्पणी करने के लिए, यह प्रश्न 2012 से था जहां तेजी से जनता के लिए भी जाना जाता था, और यहां तक ​​कि यदि यह था, तो डिजाइन पैटर्न उद्देश्य-सी और स्विफ्ट के बीच अलग-अलग होते हैं, इसलिए यदि आप विकास कर रहे हैं तो आपको इस पैटर्न से चिपकना नहीं चाहिए स्विफ्ट। –

0

इस समस्या के लिए एक और "कामकाज" के रूप में, आप प्रतिनिधिमंडल का उपयोग कर सकते हैं। एक प्रोटोकॉल बनाएं जो स्टोरीबोर्ड से आपके UIViewController उप-वर्ग के लिए डेटा स्रोत के रूप में कार्य करेगा। , इस डेटा स्रोत प्रोटोकॉल के अनुरूप इसे लागू और सही अपने UIViewController उपवर्ग लोड करने के बाद इसका इस्तेमाल:

required init?(coder aDecoder: NSCoder) 
    { 
     super.init(coder: aDecoder) 

     //invoke your data source here 
    } 

मुझे पता है ... मैं भी इस लेकिन ... पसंद नहीं है;)