SORU
12 ŞUBAT 2009, PERŞEMBE


Nasıl Xib dosyaları özel UİTableViewCells doldurulur?

Soru basit: Nasıl Xib dosyaları özel UİTableViewCells doldurulur? Böylece Arayüz Oluşturucu hücrelerin tasarımı kullanmak için izin verir. Cevap görünüşe göre bellek yönetim sorunları nedeniyle basit değildir. This thread konu bahseder ve bir çözüm öneriyor, ama NİV-serbest ön ve kod yoksun. Burada kesin bir cevap vermeden konu anlatılır long thread.

İşte kullandığım kod:

static NSString *CellIdentifier = @"MyCellIdentifier";

MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil];
    cell = (MyCell *)[nib objectAtIndex:0];
}

Bu kodu kullanmak için MyCell oluşturun.m/.h, istediğiniz bileşenleri için UİTableViewCell ve eklemek İBOutlets yeni bir alt sınıf. Sonra yeni bir "" dosya. Boş XİB oluşturun İB in Xib dosyasını açın UİTableViewCell bir nesne eklemek, onun tanımlayıcı ayarlamak"", ve onun sınıf ve bileşenleri MyCell eklemek için ayarlayın. MyCellİdentifier Son olarak, bileşenleri İBOutlets bağlayın. İB Dosyanın Sahibi set vermedi unutmayın.

Diğer yöntem ise Xib ek bir fabrika sınıfı ile yüklü değil, Dosyanın Sahibi, ayar ve bellek sızıntısı uyarmak savunucusu. Aletleri/Sızıntıları altında yukarıdaki test ettim ve bellek sızıntıları gördüm.

Xibs hücreleri yüklemek için kurallı yolu nedir? Dosyanın Sahibi mi göndereceğiz? Bir fabrika ihtiyacımız var mı? Eğer öyleyse, fabrika kodunu neye benziyor? Eğer birden fazla çözüm varsa, bunların her birinin artılarını ve eksilerini izah edeyim...

CEVAP
21 Aralık 2009, PAZARTESİ


Burada original author states was recommended by an IB engineer olan iki yöntem.

Daha fazla ayrıntı için asıl sonrası bakın. Basit gibi görünüyor yöntem #2 tercih ederim.

Yöntem #1:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BDCustomCell"];
    if (cell == nil) {
        // Create a temporary UIViewController to instantiate the custom cell.
        UIViewController *temporaryController = [[UIViewController alloc] initWithNibName:@"BDCustomCell" bundle:nil];
        // Grab a pointer to the custom cell.
        cell = (BDCustomCell *)temporaryController.view;
        [[cell retain] autorelease];
        // Release the temporary UIViewController.
        [temporaryController release];
    }

    return cell;
}

Yöntem #2:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BDCustomCell"];
    if (cell == nil) {
        // Load the top-level objects from the custom cell XIB.
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"BDCustomCell" owner:self options:nil];
        // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain).
        cell = [topLevelObjects objectAtIndex:0];
    }

    return cell;
}

Güncelleme (2014): Yöntem #2 hala geçerli, ancak artık bir belge yok. official docs eskiden ama şimdi çizimlerini lehine kaldırılır.

Github üzerinde çalışan bir örnek ben kazanırım:)
https://github.com/bentford/NibTableCellExample

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonathan Morrison

    Jonathan Mor

    24 Mart 2010
  • RyanXLT

    RyanXLT

    22 Ocak 2011
  • The Computer Chronicles

    The Computer

    7 Kasım 2012