2012-08-31 15 views
7

'u kullanmadan programlı görünümler oluşturma nasıl yapılır? Veri değişikliklerini hariç, aynı görünümdeki bir dizi alt görünümle kaydırma görünümünü doldurmaya çalışıyorum. Eğer programatik olarak her şeyi yapmak istersem, şöyle yapabilirim:iOS: XIB kullanarak, ancak View Controller

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]; 
} 

Tüm iyi. Şimdi, SubView'ım biraz daha karmaşıksa aynı şeyi nasıl yapabilirim ve Interface Builder ve bir xib arşiviyle onu düzenlemek isterim? Şimdiye kadar var:

  • , bir IBOutlet NSString * dataLabel
  • oluşturulan benim xib dosyasıyla UIView uzanan, kendi özel görünüm kodunu ItemSubview oluşturulan sınıf ItemSubview olması dosyanın sahibini ayarlayın ve bağladım benim

    bunu yaptığınızda, benim itemSubview çekilir
    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]; 
    } 
    

    (I itemSubview arka plan rengini görebilir) ama: kodunda,

sonra prize etiketlemek xib arşivinde bulunan dataLabel. Neyi özlüyorum/anlamadım? Bu neden programlı çalışıyor, fakat bir xib dosyasıyla çalışmıyor?

cevap

8

bunu böyle yapın:

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

sizin xib dosyasında, üst düzey görünümü sınıf ItemSubview ait olduğundan emin olun ve dataLabel düzgün ItemSubview en prize bağladım olduğunu. Dosyanın sahibi boş bırakılmalıdır.

+0

Bu yardımcı oldu. ItemSubview, arka plan ve boyutta xib'den çıktı, ancak hala dataLabel alt-alt görünümünde görüntülenmedi. (Xib'de ayarlanan varsayılan değer bile değil.) Dosyanın sahibi boş ve dataLabel'deki çıkış itemSubview'e (xib'deki tek üst düzey nesne olan) bağlanır. Hata ayıklayıcı, etiketin doğru değerde olduğunu, ancak ekranda görünmediğini söylüyor. Hmmm ... – meriial

+0

Bu garip. ÖğeSubview sınıfının bir NSString * olan bir IBOutlet'i olduğunu yazdığınızı fark ettim. Bu bir UILabel * değil mi? Sanırım bu soruda muhtemelen bir yazım hatası. Bunu deneyebilirsiniz: xib dosyasını tamamen silin, Xcode'u yeniden başlatın ve xib dosyasını yeniden oluşturun. Bazen Xcode sadece berbat olur. Bunun dışında, belki de SubViews, ItemSubview sınıfı ve xib dosyanızın bir görüntüsünü eklemek için kullandığınız tam kodu yazabilirsiniz. – Darren

+0

Sorunum, [itemSubview release] oldu. Böylece, bu kaldırıldı, hepsi iyi. – meriial

İlgili konular