UITableViewCell Kopyalama

oy
7

Ben özel bir tablo hücresini okuyorum tableView:cellForRowAtIndexPath:bir ucu dosyasından. Oldukça yavaş olması dışında bu, benim amaçlar için iyi çalışıyor.

Şimdi, uzun vadede yapılacak doğru şey böyle devam kod tamamen hücreyi oluşturmak için, ve tek bir görünüm kullanmak ve biliyorum. Ama bu bir prototip olduğunu ve bunun içine bu kadar çaba sarf etmek istemiyoruz.

Şimdilik, ben sadece bir defa ve ucun okuyordu eğer mutlu olurum UIViewControlleralt sınıf, sonra tableView:cellForRowAtIndexPath:kopyalarını yaptı. Benim buradaki varsayım kopyalama ve ucun okuma daha hızlı olacağıdır.

İşte ben den çağrı ucunu, yüklemek için kullandığım şey viewDidLoad:(ve retainsonrası)

-(id)loadFromNamed:(NSString*)name {
    NSArray *objectsInNib = [[NSBundle mainBundle] loadNibNamed:name
                                                          owner:self
                                                        options:nil];
    assert( objectsInNib.count == 1 );
    return [objectsInNib objectAtIndex:0];
}

Tüm şimdiye kadar iyidir. Ama soru şu: Nasıl defalarca bu anlaşıldı mı? Hatta mümkün mü?

Denedim [_cachedObject copy]ve [_cachedObject mutableCopy]ancak UITableViewCellher iki kopya protokolünü desteklemez.

Ben gerekirse, ben tamamen ucunu kaldırmak için hazırım kadar sadece hız görmezden bunları söyleyebilirim, ama yerine burada düşük asılı meyve varsa biraz daha hızlı gidiş iyi olur.

Herhangi bir fikir?

Oluştur 20/02/2009 saat 21:43
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
8

I Tablo hücresinin baş düşünmek hücreye bir kez (uç veya programlı veya diğer uç otomatik olarak yüklenen alma ve IB bir çıkış olarak bağlama) klonlamak ya da sıradan çıkarma ve daha sonra oluşturmak sağlayacak olan Dequeuing mekanizması ile birlikte kullanılabilir ihtiyaç duyulduğunda.

UITableViewCell NSCopying protokole uymuyor, ama Kama arşivleme / unarchiving mekanizmasını destekler, bu nedenle Klonlama için kullanılabilir.

"Yanıta göre ? Nasıl Objective C bir UIButton çoğaltmak için " benim veri kaynağı temsilci yöntemi gibi görünür:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellID = @"CellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellID];

    if (!cell) {
        NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self.tableViewCell];
        cell = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData];
    }

    // ... config ...

    return cell;
}

Ve benim durumumda self.tableViewCell görünümün ucu dosyasından bir kez yüklendi bir hücredir.

Ben ne olacağını test yok daha hızlı: çerçeve halinde yapacağız hangi klonlamak için "arşivleme + arşivden çıkarma" veya "Yük ucu dosyası + arşivden çıkarma" sahibi:: seçenekleri: -loadNibNamed , ben sadece kolaylık hususlar ile bu yöntemi kullanılan ancak iyi şans dosya operasyonu vs bellek işlemi daha hızlı olacağı.

DÜZENLEME: ilk başta göründüğü kadar kolay değildir görünür. UIImage NSCoding uygun olmadığından, yapılandırılmış UIImageViews ile hücreler sadece ek kod olmadan kopyalanamaz. Evet, tüm görüntü kopyalama bu işaret için Apple'a iyi bir uygulama, şerefe kesinlikle değil.

Cevap 17/03/2011 saat 13:00
kaynak kullanıcı

oy
6

Tablo görünümünde yerleşik hücre klonlama kullanın. Elma tablo hücrelerinin çok üreten yavaş olduğunu biliyordum. Bu yöntem için docs göz atın:

- (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier

Yeni hücreler rica olunur olarak, o zaman, bir kez hücreyi oluşturmak mevcut hücreleri klonlamak için bu yöntemi kullanın. Sonra sadece yeni hücre hakkında değiştirilmesi ne ihtiyacı değiştirmek ve hücre nesnesini döndürür.

Ayrıca bu yöntemi kullanan Apple tarafından sağlanan tablo görünümü realted örnek kodu kontrol etmek ve size doğru yolu gösterir. cep bir uç elde yüklendi aslında hiç önemli olmamalı.


Minör açıklama: Senin için yukarıdaki yöntem klon hücrelerini sanmıyorum. Bunun yerine ekranın dışına kaydırdığınız hücre nesnesini alır ve sadece yeni bir noktaya taşır. Yani tam anlamıyla bir hücreyi yeniden ediyor. Şimdi özel tablo görünümü intialization dışında ihtiyaç duyduğu tüm yeni değerlere ayarlanabilir emin olun.

Cevap 20/02/2009 saat 22:11
kaynak kullanıcı

oy
4

Değil bu çözümün gurur, ama mümkün IB bağlamaları maksimum sayıda çalışır:

Arabirimi (AlbumTableViewCell bir örnek AlbumViewController en XIB dosyasında tanımlanan hangi UITableViewCell alt sınıfı):

@interface AlbumsViewController : UITableViewController {
    IBOutlet AlbumTableViewCell *tableViewCellTrack;
}

@property (nonatomic, retain) AlbumTableViewCell *tableViewCellTrack;

Uygulama (Arşivden kaldırmak / arşiv kopyasını / klonlar tablo görünümü hücresi yapar):

@implementation AlbumsViewController

@synthesize tableViewCellTrack;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    AlbumTableViewCell *cell = (AlbumTableViewCell *)[tableView dequeueReusableCellWithIdentifier: @"AlbumCell"];

    if (cell == nil) {
        AlbumsViewController *albumsViewController = [[[AlbumsViewController alloc] init] autorelease];
        [[NSBundle mainBundle] loadNibNamed: @"AlbumsViewController" owner: albumsViewController options: nil];

        cell = albumsViewController.tableViewCellTrack;
    }

    cell.labelTitle.text = ...;
    cell.labelArtist.text = ...;

    return cell;
}
Cevap 08/12/2009 saat 10:06
kaynak kullanıcı

oy
3

Eh, orada tüm öğreticiler bu adımı belirtmez neden emin değilim.

dequeueReusableCellWithIdentifier çağırarak, kalem ucu kendi UITableViewCell kullanırken yeterli değildir. Sen Tablo Görünümü Hücre sekmesi bölümünde sadece bunun için için, IB "Identifier" belirtmeniz gerekir.

Sonra IB koymak tanımlayıcınızın dequeueReusableCellWithIdentifier için kullanmak tanımlayıcısıyla aynı olduğundan emin olun.

Cevap 17/06/2009 saat 05:10
kaynak kullanıcı

oy
1

İşte Swift ise

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    var cell : UITableViewCell?
    let cellId = String(format: "Cell%d", indexPath.row)
    cell = alertTable!.dequeueReusableCellWithIdentifier(cellId) as! UITableViewCell?

    if cell == nil {
        let archivedData = NSKeyedArchiver.archivedDataWithRootObject(masterTableCell!)
        cell = NSKeyedUnarchiver.unarchiveObjectWithData(archivedData) as! UITableViewCell?
    }

    // do some stuff

    return cell!
}
Cevap 24/10/2015 saat 02:00
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more