2011-09-11 12 views
5

नहीं कहा जाता है, मैं प्रोग्रामिंग के रूप में एक नेविगेशन नियंत्रक के भीतर एक UIViewController सेट करना चाहता हूं, हालांकि loadView और न हीडिडलोड विधि को कॉल किया जाता है। loadView करनेUIViewController का loadView

MyViewController *viewController = [[MyViewController alloc] init]; 
UIView *view = [[UIView alloc] initWithFrame:window.frame]; 
viewController.view = view; 

UINavgationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

[window addSubview:[navController view]; 
[window makeKeyAndVisible]; 

जब मैं अनुप्रयोग मैं एक navigationbar देखना शुरू करते हैं, लेकिन कोई कॉल:

यह एप्लिकेशन प्रतिनिधि में मेरी कोड है। मैं क्या खो रहा हूँ? मैंने सोचा था कि loadView बुलाया जाता है के बाद आप view

संपादित

MyViewController *viewController = [[MyViewController alloc] init]; 
[viewController view]; // doesn't look right? 

UINavgationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

[window addSubview:[navController view]; 
[window makeKeyAndVisible]; 

योना की टिप्पणी की ओर संपादित फोन है, लेकिन अभी भी loadView बुलाया प्राप्त करता है।

उत्तर

10

एक UIViewController अपने दृश्य जब नियंत्रक के view गेटर कहा जाता है और उसके दृश्य वर्तमान में nil है (एक निब से लोड हो रहा है या -loadView को लागू करने से) पैदा करेगा।

दिखाए गए कोड में आपने कभी भी व्यू प्रॉपर्टी के गेटटर को नहीं बुलाया, केवल उसका सेटटर।

इसके अलावा, आप अपने ऐप प्रतिनिधि से नियंत्रक का दृष्टिकोण असाइन कर रहे हैं। UIViewController से मांग पर अपने विचार बनाने की उम्मीद है, उन्हें किसी अन्य वर्ग द्वारा प्रदान नहीं किया गया है। यह दृष्टिकोण आपको बाद में समस्याएं पैदा करेगा जब आप महसूस करेंगे कि नियंत्रक इसके दृश्य को अनलोड करता है और स्मृति चेतावनियों के जवाब में इसे फिर से बनाने का प्रयास करता है। अपने नियंत्रक को अपना विचार बनाने दें, इसे पास करने की कोशिश न करें।

+0

अपनी दूसरी टिप्पणी के बारे में, दृश्य निर्दिष्ट करते हुए, आपका मतलब कोड की दूसरी और तीसरी पंक्ति है, है ना? यह समझ आता है। लेकिन मैं इस मामले में गेटर को कैसे बुलाऊंगा? –

+0

'[व्यू कंट्रोलर व्यू] 'दृश्य के गेटटर को आमंत्रित करता है लेकिन आपको ऐसा करने की आवश्यकता नहीं होनी चाहिए। 'UINavigationController' आपने अपना व्यू कंट्रोलर जोड़ा है ताकि दृश्य पदानुक्रम में आपके नियंत्रक के दृश्य को जोड़ने के लिए कुछ बिंदु पर गेटर को कॉल किया जा सके। क्या आप अपना व्यू कंट्रोलर कार्यान्वयन साझा कर सकते हैं? ऐसा लगता है कि आपके पास कुछ और चल रहा है। – Jonah

+0

यह मूल रूप से एक्सकोड से खाली UIViewController टेम्पलेट है, लेकिन init के अलावा कोई (दृश्य) विधि कॉल नहीं की जाती है। वहां मैंने इस तरह एक दृश्य स्थापित करने की कोशिश की: - (आईडी) init { \t स्वयं ((स्वयं = [सुपर init])) { \t UIView * view = [[UIView alloc] initWithFrame: [[UIScreen mainScreen] सीमाएं] ]; \t self.view = देखें; \t [देखें रिलीज]; \t} स्वयं लौटें; } –

2

शायद आपको इस समस्या का सामना नहीं करना पड़ेगा ... लेकिन दूसरे दिन मैं एक ही परेशान परेशानी में भाग गया .. लोडव्यू, व्यूडिडलोड और देखेंविल यूपीआई को मेरे UIViewController में नहीं बुलाया जा रहा है।

मेरा मुद्दा v सरल था, लेकिन अगर आप बहुत सावधान नहीं हैं तो पकड़ने में थोड़ा मुश्किल है।

-(void) loadView 

लिखने की बजाय मैं ने लिखा है:

-(void) loadview 

कृपया ध्यान दें कि यह किसी चेतावनी के सक्रिय नहीं होगा। LoadView में "वी" और "वी" का अंतर आसानी से याद किया जा सकता है। और जाहिर है, चूंकि loadView को कॉल नहीं किया गया था, इसलिए ViewDidLoad/viewWillAppear को या तो नहीं कहा जाएगा क्योंकि कोई दृश्य नहीं था जो लोड हो गया था (किसी भी nib का उपयोग नहीं कर रहा हूं ... प्रोग्राम को देखने के लिए तैयार करना)। अगर आप अपने कार्यान्वयन में मेल खाने वाले @property के बिना एक

@synthesize view; 

परिभाषित

-Anshu

2

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

+1

आह! यह मुझे मिला। मैं एक अति उत्साही खोज/प्रतिस्थापन ऑपरेशन के कारण कक्षा में "@ सिंथेसाइज व्यू" के साथ समाप्त हुआ, मुझे इसका एहसास नहीं हुआ, और अचानक मेरा दृश्य पूरी तरह से खाली था क्योंकि लोडव्यू को और कभी नहीं बुलाया गया था। यह ट्रैक करने के लिए मुश्किल था। धन्यवाद! –

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