2013-01-24 28 views
5

मैं UIViewController का एक उपवर्ग है:सिंगल UIViewcontroller, एकाधिक xibs के बीच स्विच कैसे करें?

@interface KBViewController : UIViewController 
कई xib रों साथ

, उदाहरण के लिए, एक एक Qwerty है और एक अन्य Dvorak लेआउट है:

KBViewControllerQuerty~iphone.xib 
KBViewControllerDvorak~iphone.xib 

तो उपयोगकर्ता एक बटन क्लिक करते हैं, QwertyDvorak पर स्विच है। जैसा कि आप देख सकते हैं, कोड तर्क दोनों कीबोर्ड लेआउट के लिए समान है। मुझे को xib के साथ पुनः लोड करना है।

उम्मीद है, Dvorakxib में सभी बटन हुक जवाब IBOutlet रों को KBViewController में होगा।

दो xib एस के बीच स्विच करने का सही तरीका क्या है?

+0

आप मतलब को पुनः आरंभ कर करते हैं अलग निब साथ दृश्य नियंत्रक? मुझे नहीं लगता कि यह संभव है। पुराने को एक नया –

+0

के साथ बदलने का प्रयास करें, मैं 'स्वयं को प्रतिस्थापित करना चाहता हूं।'KBViewController' में' देखें और उम्मीद है कि 'ड्वोरक' xib के सभी बटन को 'KBViewController' के प्रतिसाद' IBOutlet के लिए लगाया जाएगा। – ohho

उत्तर

6

सभी निब्स नामित File's Owner है। आईबीओलेट और आईबीएक्शन लिंकिंग File's Owner के आधार पर किया जाता है। तो आप एक व्यू कंट्रोलर और दो निब्स को परिभाषित कर सकते हैं, प्रत्येक निब फ़ाइल के File's Owner परिभाषित दृश्य नियंत्रक पर सेट किया गया है।

यही है, अगर आप KBViewController करने के लिए सभी KBViewController * .xib फ़ाइलों के File's Owner सेट और आप KBViewController * लोड कर सकता है .xib आप initWithNibNamed विधि (पुन: दृश्य नियंत्रक)

तो द्वारा चाहते हैं कहीं एक KBViewController वस्तु है आपको एक ही KBViewController ऑब्जेक्ट को सभी के साथ बनाए रखना चाहिए, आप निब के बिना KBViewController ऑब्जेक्ट बना सकते हैं। KBViewController.m में, loadView लागू करें और -[NSBundle loadNibNamed] विधि के साथ मैन्युअल रूप से UIView ऑब्जेक्ट लोड करें (प्रोग्राम को स्वचालित रूप से लोड करें और बदलें।

UIView *someView = [[[NSBundle mainBundle] loadNibNamed:@"SomeNibFile" 
                owner:self 
               options:nil] objectAtIndex:0]; 
self.view = someView; 

नोट owner:self उपरोक्त कोड में। यह @ "कुछNibFile" के File's Owner के साथ मेल खाना चाहिए।

पहले से ही भरा हुआ है दृश्य बदलने के लिए:

id superview = self.view.superview; 
[self.view removeFromSuperview]; 
UIView *someView = [[[NSBundle mainBundle] loadNibNamed:@"SomeNibFile" 
                owner:self 
               options:nil] objectAtIndex:0]; 
self.view = someView; 
[superview addSubview:self.view]; 

अधिक विस्तृत विवरण: Resource Programming Guide - Loading Nib Files Programmatically

+0

धन्यवाद! यह बहुत अच्छा काम किया। – SeanK

0

आप अपनी निब फ़ाइल को मैन्युअल रूप से लोड कर सकते हैं और view अपने व्यू कंट्रोलर की विशेषता को बदल सकते हैं या क्रमशः इच्छित दृश्य को बदल सकते हैं। जब वहाँ केवल एक ही अपने निब फ़ाइल में UIView जड़ वस्तु

आपके विचार लोड करने के बाद, आप सेट कर सकते हैं

self.view = someView; 
बेशक

, यदि आप एक है

UIView *someView = [[[NSBundle mainBundle] loadNibNamed:@"SomeNibFile" 
                 owner:self 
                options:nil] objectAtIndex:0]; 

objectAtIndex:0 केवल सही है अपने व्यू कंट्रोलर में सबव्यूव, फिर आप इसे भी बदल सकते हैं।

+0

क्या यह नए निब में नियंत्रण को वर्तमान दृश्य नियंत्रक के 'IBOutlet' में जोड़ता है? – ohho

+0

नहीं, मुझे ऐसा नहीं लगता है, लेकिन आपके KBViews के लिए 'UIView' सबक्लास लिखना संभव होगा और प्रत्येक दृश्य को अपनी xib फ़ाइलों में इस सबक्लास में लिंक करें। फिर, आपके पास अपने उप-वर्गीकृत 'UIView' के दृश्य के साथ' UIViewController' है और नियंत्रण उप-वर्ग में लगाए गए हैं। जब आपकी दोनों xib फ़ाइलों में आपके 'UIView' उपclass के समान हुक होते हैं तो यह आपके जैसा काम करना चाहिए। – who9vy