2010-01-22 8 views
11

में .xibs लोड हो रहा है मेरे पास अपने स्वयं के .xib के साथ एक UIViewController है, और मैं स्क्रीन के निचले हिस्से पर अलग-अलग जानकारी प्रदर्शित करने के लिए एक UISegmentedControl का उपयोग करना चाहता हूं। मैंने कंटेनर के .xib में एक UIView बनाया और कंटेनर के UIViewController में detailView नामक UIView प्रॉपर्टी से कनेक्ट किया।एक UIView

मैंने आईबी में तीन .xib फ़ाइलों को बनाया, एक दृश्य के लिए कि प्रत्येक सेगमेंट को detailView क्षेत्र में प्रदर्शित करने की आवश्यकता है।

अब मैं अटक गया हूं क्योंकि मुझे नहीं पता कि उपयुक्त .xib फ़ाइल को detailView क्षेत्र में लोड और अनलोड कैसे करें। यहाँ मैं कहाँ हूँ:

- (void)segmentValueChanged:(id)sender { 
    switch ([sender selectedSegmentIndex]) { 
     case 0: 
      // Unload whatever is in the detailView UIView and 
      // Load the AddressView.xib file into it 
      break; 
     case 1: 
      // Unload whatever is in the detailView UIView and 
      // Load the ContactsView.xib file into it 
      break; 
     case 2: 
      // Unload whatever is in the detailView UIView and 
      // Load the NotesView.xib file into it 
      break; 
     default: 
      break; 
    } 
} 

तो मैं रिक्त स्थान को कैसे को भरने और उतारना है/detailView UIView ठीक से लोड?

धन्यवाद!

--UPDATE--

viewDidLoad में कोड है: - (शून्य) viewDidLoad { [सुपर viewDidLoad];

// Set the default detailView to be address since the default selectedSegmentIndex is 0. 
    NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"AddressView" owner:self options:nil]; 
    // assuming the view is the only top-level object in the nib file (besides File's Owner and First Responder) 
    UIView *nibView = [nibObjects objectAtIndex:0]; 
    self.detailView = nibView; 

    self.detailContainerView.autoresizesSubviews = YES; 
    [self.detailContainerView addSubview:self.detailView]; 

    NSLog(@"self.view is %@", self.view); 
    NSLog(@"self.detailContainerView is %@",self.detailContainerView); 
    NSLog(@"self.detailView is %@", self.detailView); 
} 

और डिबगर संदेशों हैं:

self.view is UIView: 0x3a24d80; frame = (0 0; 320 460); autoresize = RM+BM; layer = CALayer: 0x3a35190 
self.detailContainerView is UIView: 0x3a1aea0; frame = (20 57; 280 339); autoresize = W+H; layer = CALayer: 0x3a36b80 
self.detailView is UIView: 0x3a24d80; frame = (0 0; 320 460); autoresize = RM+BM; layer = CALayer: 0x3a35190 

धन्यवाद!

उत्तर

24

एनएसबंडल के loadNibNamed:owner:options: का उपयोग करें। यह एनआईबी फ़ाइल में सभी शीर्ष-स्तरीय ऑब्जेक्ट्स की एक सरणी देता है, जिसे आप अपने इवर्स को असाइन कर सकते हैं। यदि आपको सरणी में एकाधिक ऑब्जेक्ट्स के बीच अंतर करने की आवश्यकता है, तो प्रत्येक को आईबी में एक अद्वितीय टैग दें।

इस प्रयास करें:

case 0: 
    [[NSBundle mainBundle] loadNibNamed:@"AddressView" owner:self options:nil]; 
    break; 
... 

आप इंटरफ़ेस बिल्डर में AddressView.xib के लिए फ़ाइल के मालिक के रूप में अपने दृश्य नियंत्रक निर्दिष्ट किया है, और देखने नियंत्रक के detailView आउटलेट से XIB में दृश्य जोड़ लिया है, तो कनेक्शन दृश्य और self.detailView के बीच कॉल होना चाहिए कॉल करने के बाद कॉल होना चाहिए NibNamed (क्योंकि आपने स्वयं को स्वामी के रूप में निर्दिष्ट किया है)।

case 0: 
    NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"AddressView" owner:self options:nil]; 
    // assuming the view is the only top-level object in the nib file (besides File's Owner and First Responder) 
    UIView *nibView = [nibObjects objectAtIndex:0]; 
    self.detailView = nibView; 
    break; 
... 

स्विच बयान में सभी मामलों के लिए एक ही कार्य करें:

यदि वह काम नहीं करता है, कुछ इस तरह की कोशिश करो। यदि आपने @property (retain) के रूप में विवरण देखें, self.detailView = ... असाइनमेंट किसी भी पहले लोड किए गए विचारों को जारी करने का ख्याल रखेगा। विशेष रूप से एनआईबी सामग्री को अनलोड करने की कोई ज़रूरत नहीं है।

+0

मुझे पूरा यकीन नहीं है कि इसे एक साथ कैसे रखा जाए। क्या मुझे .xib के प्रत्येक के लिए 'loadNibNamed: स्वामी: विकल्प:' कॉल करने की आवश्यकता है?क्या ऐसा करने का विचार पाने के लिए कुछ मोटा कोड देखना संभव होगा? बहुत बहुत धन्यवाद! –

+0

मैंने अपने उत्तर में कुछ कोड जोड़ा है। –

+0

ओले, महान कोड के लिए धन्यवाद! एकमात्र समस्या जो मैं चल रहा हूं वह यह है कि जब मैं कॉल -लोड नामांकित करता हूं: मालिक: विकल्पों को एनआईबी पूरे दृश्य के शीर्ष पर ओवरलैड किया जाता है, जिसमें यह अंदर होना चाहिए। ऐसा लगता है कि 'self.detailView = nibView;' विस्तारित एनआईबी का आकार विस्तार के अंदर फिट करने के लिए आकार नहीं बदलता है जो कि आईबी में स्थापित किया गया था। यहां कोई विचार है? धन्यवाद! –

1

मूल रूप से आप UIViewController के initWithNibName उपयोग करने के लिए आप क्या चाहते हैं क्या करने की जरूरत:

UIViewController *aViewController = [[UIViewController alloc] initWithNibName:@"AddressView" bundle:nil]; 
[self.detailView addSubview:aViewController.view]; 
[aViewController release]; // release the VC 

अपने AddressView xib में, UIViewController करने के लिए फ़ाइल के मालिक वर्ग निर्धारित किया है। व्यू क्लास कस्टम एड्रेस व्यू क्लास होना चाहिए।

इस तरह आप मुख्य xib फ़ाइल का उपयोग करके सबव्यू को स्थान और आकार दे सकते हैं। फिर नियंत्रण के लेआउट के लिए सबव्यू के xib का उपयोग करें।