2011-03-21 7 views
6

मेरे पास MyViewNSView से विरासत में मिला है और इसमें आवृत्ति चर NSImage * image; है। क्लास कार्यक्षमता दृश्य पर छवि खींचना है।एनएसवीव प्रारंभिकरण: -इनिट: बनाम -वेकफ्रॉमनिब:

हालांकि, -drawRect: छवि उदाहरण में हमेशा समान nil, अगर यह -init: समारोह में नहीं nil प्रारंभ किया गया था और अगर यह -awakeFromNib: में प्रारंभ किया गया था। लॉग दोनों -init: और -awakeFromNib: कार्यों को केवल एक बार बुलाया जाता है।

क्या -awakeFromNib: डिफ़ॉल्ट रूप से जीयूआई घटक पुन: प्रारंभ करें?

उत्तर

8

नहीं awakeFromNib के लिए कोई डिफ़ॉल्ट कार्यान्वयन नहीं है।

आपकी समस्या यह है कि आप गलत प्रारंभिक विधि को ओवरराइड कर रहे हैं। एक NSView का designated initializerinitWithFrame: है। आपके उप-वर्ग का सादा init कभी नहीं बुलाया जाता है, और यही कारण है कि आपका image ivar कुछ भी इंगित नहीं करता है।

आप उस ivar को awakeFromNib या initWithFrame: में प्रारंभ कर सकते हैं। इससे कोई फ़र्क नहीं पड़ता। पूर्व को बाद के बाद बुलाया जाता है, और इसे एक बिंदु के रूप में प्रदान किया जाता है जहां आप प्रारंभिक कोड डाल सकते हैं जिसे आपके निब में अन्य ऑब्जेक्ट्स (आपके IBOutlets के माध्यम से) के साथ बातचीत करने की आवश्यकता होती है।

+0

हालांकि कुछ मामलों में '-initWithFrame' [बिल्कुल भी नहीं कहा जाता है] (http://stackoverflow.com/questions/433539/initwithframe-not-called-but-awakefromnib-is)। – jlstrecker

+7

केवल _one_ मामला है जब आपका कस्टम सबक्लास का 'initWithFrame:' बिल्कुल नहीं कहा जाएगा: जब इसे किसी अन्य 'NSView' subclass से प्राप्त होता है जो आईबी पैलेट (उदाहरण के लिए, 'NSImageView') में मौजूद होता है, और आप इसका उदाहरण बनाते हैं आइडेंटिटी इंस्पेक्टर में कक्षा को बदलकर अपने कस्टम सबक्लास। उस स्थिति में, ऐपकिट सबक्लास के 'initWithFrame: '_will_ को बुलाया जाएगा, और आपके कस्टम सबक्लास को' initWithCoder 'प्राप्त होगा:' जागने से पहले 'FNNN'। यदि आप आईबी में "कस्टम व्यू" ऑब्जेक्ट का उपयोग करके अपना व्यू इंस्टेंस बनाते हैं, तो आपके व्यू का 'initWithFrame:' वास्तव में कॉल किया जाता है। –