2009-12-20 11 views
9

लोड करें मान लें कि मैं एक निब से दृश्य नियंत्रक लोड करता हूं, और दृश्य के पीछे इसके एक सबव्यू के साथ कुछ करने का निर्णय लेता हूं। समय के बाद में, मैं इस दृश्य नियंत्रक के दृश्य को दिखाऊंगा।एक दृश्य बनाएं (initWithNibName से प्रारंभ) अपने सभी सबव्यू

viewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
[viewController.someSubview doSomething]; 

//later on 
[mainView addSubview:viewController.view]; 

समस्या यह है कि, someSubview वस्तु लोड करने के लिए जब तक दृश्य का प्रकटन प्रतीत नहीं होता है, तो विधि DoSomething नहीं बुलाया जाता है। अब तक मेरा कामकाज कॉल करना है:

[mainView addSubview:viewController.view]; 
[viewController.view removeFromSuperview]; 

पहले व्यू कंट्रोलर के सबव्यूज़ को आरंभ करने के लिए। क्या इस कार्य के लिए कोई और शानदार तरीका है (जैसे लोडस्यूब्यूज विधि या कुछ)?

उत्तर

23

सबसे पहले मैं बस की कोशिश करेगा प्रॉपर्टी एक्सेस:

[viewController view]; 

यह दृश्य की आलसी लोड के लिए बाध्य करेगा (और इस प्रकार subviews और दुकानों आदि) और यह आपके लिए पर्याप्त हो सकता है। डिफॉल्ट रूप से नियंत्रक देखें जब तक आप इसे एक्सेस न करें तब तक उनका दृश्य लोड नहीं होगा, इसलिए हो सकता है कि आप देरी देख रहे हों।

इस तरह के भार को मजबूर करना आमतौर पर समाधान होता है जब आप आउटलेट संपत्ति तक पहुंचने का प्रयास कर रहे होते हैं लेकिन वास्तव में यह आपके मामले में someSubview जैसा नहीं है।

तुम भी बातें देखने को जोड़ने, लेकिन यह छिपा हुआ बनाकर थोड़ा सुधार कर सकते हैं: फिर

viewController.view.hidden = YES; 
[mainView addSubview:viewController.view]; 

बजाय addSubview बुला जब आप इसे दिखाना चाहते हैं, बस कार्य करें:

viewController.view.hidden = NO; 

मैं UIViewAnimationTransitionFlipFromRight आदि संक्रमणों का उपयोग करके विचारों में एनिमेट करते समय इस विधि का उपयोग किया है। यहां तक ​​कि जब दृश्य के आलसी भार को मजबूर करना अभी भी एक उल्लेखनीय अंतराल है, तो मैंने प्रदर्शन को बेहतर बनाने के लिए इसका उपयोग किया है।

+0

धन्यवाद का उपयोग करें, कि यह किया था। – iamj4de

+0

@ मार्कआमेरी ऐप्पल आपको स्पष्ट रूप से दस्तावेज में कॉल -लोड देखने के लिए नहीं कहता है: "आपको इस विधि को सीधे कॉल नहीं करना चाहिए। दृश्य नियंत्रक इस विधि को कॉल करता है जब इसकी दृश्य संपत्ति का अनुरोध किया जाता है लेकिन वर्तमान में शून्य है। यह विधि दृश्य को लोड या बनाता है और इसे दृश्य संपत्ति को सौंपता है। " –

+0

@ माइकवेलर अच्छा बिंदु - मैंने इसे जानने के लिए पर्याप्त दस्तावेज़ीकरण को नहीं देखा था। मुझे लगता है कि हमें दो थोड़ा बदसूरत हैक्स के बीच चयन करना होगा। मेरे हिस्से के लिए, मैं शायद 'लोड व्यू' पर चिपके रहूंगा क्योंकि यह अधिक स्पष्ट है, लेकिन मैं स्वीकार करता हूं कि यह साफ समाधान नहीं है जिसे मैंने सोचा था। –

0

आईओएस 9 -(void) loadViewIfNeeded

शुरू की मैं

if ([_myVC respondsToSelector:@selector(loadViewIfNeeded)]) { 
    [_myVC loadViewIfNeeded]; 
} else { 
    [_myVC view]; 
} 
संबंधित मुद्दे