2012-08-31 11 views
7

का उपयोग किए बिना मैं डेटा परिवर्तनों को छोड़कर, समान सबव्यूज़ के साथ एक स्क्रॉल व्यू भरने की कोशिश कर रहा हूं। अगर मैं पूरी तरह से प्रोग्राम करना चाहता हूं, तो मैं ऐसा कर सकता हूं:आईओएस: XIB का उपयोग करके प्रोग्रामेटिक रूप से दृश्य कैसे बनाएं, लेकिन व्यू कंट्रोलर

int width = 110; 
int count = 0; 
self.scrollView.contentSize=CGSizeMake(width*[items count],100); 

for (NSString *id in items) { 
    Item *item = [items objectForKey:id]; 
    CGRect frame = CGRectMake(count*width, 0, 100, 100); 
    UIView *itemSubview = [[UIView alloc] initWithFrame:frame]; 

    CGRect dataLabelFrame = CGRectMake(0, 52, 35, 30); 
    UILabel* dataLabel = [[UILabel alloc] initWithFrame: dataLabelFrame]; 
    dataLabel.text = @"Data specific to item"; // item.property or something 
    dataLabel.font:[UIFont systemFontOfSize:30]; 
    dataLabel.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]; 

    [itemSubview addSubview:dataLabel]; 
    [self.scrollView addSubview:itemSubview]; 
    [itemSubview release]; 
} 

सभी अच्छे। अब, मैं वही काम कैसे करूं यदि मेरा सबव्यू थोड़ा जटिल है, और मैं इसे इंटरफ़ेस बिल्डर और एक xib संग्रह के साथ रखना चाहता हूं? अब तक मेरे पास है:

  • मेरे अपने कस्टम दृश्य कोड, ItemSubview बनाया, एक IBOutlet NSString * dataLabel मेरी xib फ़ाइल
  • बनाया साथ UIView विस्तार, फ़ाइल के मालिक सेट वर्ग ItemSubview का हो सकता है, और झुका मेरी आउटलेट से लेबल

तो, कोड में:

int width = 110; 
int count = 0; 
self.scrollView.contentSize=CGSizeMake(width*[items count],100); 

for (NSString *id in items) { 
    Item *item = [items objectForKey:id]; 
    CGRect frame = CGRectMake(count*width, 0, 100, 100); 
    ItemSubview *itemSubview = [[ItemSubview alloc] initWithFrame:frame]; 
    [itemSubview setBackgroundColor:[UIColor colorWithRed:0.0 green:0.2 blue:0.0 alpha:0.2]]; // to see where it ends up 

    [[NSBundle mainBundle] loadNibNamed:@"ItemSubview" owner:itemSubview options:nil]; 
    itemSubview.dataLabel.text = @"Data specific to item"; // item.property or something 
    [self.scrollView addSubview:itemSubview]; 
    [itemSubview release]; 
} 

जब मैं ऐसा करते हैं, मेरी itemSubview तैयार हो जाता है (मैं itemSubview की पृष्ठभूमि का रंग देख सकते हैं), लेकिन नहीं डेटा लेबल जो xib संग्रह में था। मुझे क्या याद आ रहा है/समझ में नहीं आ रहा है? यह प्रोग्रामेटिक रूप से क्यों काम करता है, लेकिन xib फ़ाइल के साथ नहीं?

उत्तर

8

इसे इस तरह कार्य करें:

NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"ItemSubview" owner:self options:nil]; 
    ItemSubview *itemSubview = [topLevelObjects objectAtIndex:0]; 

सुनिश्चित करें कि आपके xib फ़ाइल में, शीर्ष स्तर के दृश्य वर्ग ItemSubview की है कि है, और है कि dataLabel ठीक से ItemSubview के आउटलेट को झुका है। फ़ाइल के मालिक को खाली छोड़ दिया जाना चाहिए।

+0

इससे मदद मिली। आइटम सबब्यूव पृष्ठभूमि और आकार के साथ xib से बाहर आया, लेकिन यह अभी भी इसका डेटा लेबल उप-उप-दृश्य प्रदर्शित नहीं करता है। (Xib में भी डिफ़ॉल्ट मान सेट नहीं है।) फ़ाइल का मालिक खाली है, और डेटा लेबल से आउटलेट आइटम से जुड़ा हुआ है Subview (जो xib में एकमात्र शीर्ष-स्तरीय ऑब्जेक्ट है)। डीबगर का कहना है कि लेबल सही मूल्य के साथ है, लेकिन यह स्क्रीन पर नहीं हो रहा है। हमम ... – meriial

+0

यह विषम है। मैंने देखा है कि आपने लिखा है कि ItemSubview क्लास में एक आईबीओटलेट है जो एक एनएसएसटींग * है। क्या यह UILabel * नहीं होना चाहिए? मुझे लगता है कि शायद सवाल में सिर्फ एक टाइपो है। आप इसे आजमा सकते हैं: xib फ़ाइल को पूरी तरह से हटाएं, एक्सकोड को पुनरारंभ करें और xib फ़ाइल को पुन: बनाएँ। कभी-कभी एक्सकोड बस गड़बड़ हो जाता है। इसके अलावा, हो सकता है कि आप सटीक कोड पोस्ट कर सकें जिसका उपयोग आप उपव्यू, आइटमस्यूब्यू क्लास, और अपनी xib फ़ाइल सेट अप की एक छवि को जोड़ने के लिए कर रहे हैं। – Darren

+0

मेरी समस्या, यह पता चला, [itemSubview रिलीज] था। तो, इसके साथ हटा दिया गया, सब अच्छा है। – meriial

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