copierea UITableViewCell

voturi
7

Am citit - o celulă de tabel personalizat într - tableView:cellForRowAtIndexPath:dintr - un fișier peniță. Acest lucru funcționează mare pentru scopurile mele, cu excepția faptului că este destul de lent.

Acum, eu știu un lucru bun de a face pe termen lung este de a crea celula în întregime în cod, și de a folosi un singur punct de vedere, și așa mai departe. Dar aceasta este un prototip, iar eu nu vreau să pun atât de mult efort în el.

Deocamdată, aș fi fericit dacă am citit penița doar o singură dată în UIViewControllersubclasa, apoi a tableView:cellForRowAtIndexPath:făcut copii ale acesteia. Presupunerea mea este că copierea ar fi mai rapid decât citirea peniță.

Iată ce am folosi pentru a încărca penița, pe care o numesc de la viewDidLoad:(și retaindupă)

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

Totul este bine până acum. Dar întrebarea este: Cum pot copia acest lucru de peste si peste? Este chiar posibil?

Am încercat [_cachedObject copy]și , [_cachedObject mutableCopy]dar UITableViewCellnu acceptă nici protocolul de copiere.

Dacă trebuie, eu pot spune doar le să ignore viteza până când sunt pregătit pentru a elimina penița în întregime, dar aș prefera să-l duc un pic mai repede în cazul în care există un fruct low-agățat aici.

Vreo idee?

Întrebat 20/02/2009 la 21:43
sursa de către utilizator
În alte limbi...                            


5 răspunsuri

voturi
8

Cred că coping de celule de tabel poate fi utilizat împreună cu mecanismul dequeuing, ceea ce va permite crearea unei singure celule de timp (de la peniță sau programatic sau pentru a obține încărcat automat din alte peniță și conectarea ca un orificiu de evacuare în IB) și apoi clona sau dequeue-l când e nevoie.

UITableViewCell nu sunt conforme cu protocolul NSCopying, dar suporta arhivare cheie de codificare / mecanism dezarhivează, astfel încât acesta poate fi utilizat pentru donare.

„Pe baza răspunsului ? Cum se duplica un UIButton în obiectivul C “ metoda mea sursă de date delegat arata ca:

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

Și în cazul meu self.tableViewCell este o celulă care a fost încărcată o singură dată din fișierul penița View.

Nu testat ceea ce va fi mai rapid: „Arhiva + dezarhivat“ pentru a clona sau „fișier de încărcare peniță + dezarhivat“ , care va face cadru în cazul -loadNibNamed: Proprietar: opțiuni: , am folosit această metodă numai cu considerente de comoditate, dar șanse ca operațiune de memorie vs operațiune de fișier va fi mai rapid.

EDIT: Nu apare la fel de ușor cum părea la început. Ca UIImage nu este conformă cu NSCoding, celulele cu UIImageViews configurate nu pot fi pur și simplu copiate fără cod suplimentar. Da, copierea imaginii de ansamblu nu este cu siguranță o bună practică, noroc la Apple pentru a evidenția acest lucru.

Publicat 17/03/2011 la 13:00
sursa de către utilizator

voturi
6

Utilizați clonarea de celule construit în vederea mesei. Apple a cunoscut generând o mulțime de celule de masă a fost lent. Check out docs pentru această metodă:

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

Creezi celula o dată, apoi ca noi celule sunt solicitate, utilizați această metodă pentru a clona celulele existente. Apoi, tocmai ai schimba ceea ce trebuie schimbat despre noua celula si a reveni obiect de celule.

De asemenea, a verifica afară de vizualizare tabel codul eșantion realted furnizat de Apple care utilizează această metodă și să vă arate calea cea dreaptă. Faptul celula a fost încărcat dintr-o peniță care nu ar trebui sa conteze deloc.


clarificări minore: I dont cred că celulele clona metoda de mai sus pentru tine. In schimb este nevoie de obiect de celule, care au defilat pe ecran și pur și simplu le mută la un nou spot. Deci, este literalmente reutiliza o celulă. Deci, asigurați-vă că vizualizarea tabelului personalizat poate fi setat la toate noile valori de care are nevoie în afara intialization.

Publicat 20/02/2009 la 22:11
sursa de către utilizator

voturi
4

Nu este mândru de această soluție, dar funcționează cu numărul maxim de posibile legări IB:

Interfața (AlbumTableViewCell este o subclasă de UITableViewCell din care o instanță este definită în fișierul XIB AlbumViewController lui):

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

@property (nonatomic, retain) AlbumTableViewCell *tableViewCellTrack;

Punerea în aplicare (Dezarhivați / arhiva face o copie / clone celula vizualizare tabel):

@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;
}
Publicat 08/12/2009 la 10:06
sursa de către utilizator

voturi
3

Ei bine, eu nu sunt sigur de ce toate tutorialele de acolo nu specifică acest pas.

Când utilizați personalizat UITableViewCell de la Rikao, de asteptare dequeueReusableCellWithIdentifier nu este suficient. Trebuie să specificați „identificatorul“ în IB, doar pentru pentru ea în tabelul View secțiunea din fila Cell.

Apoi, asigurați-vă că identificatorul pe care a pus în IB este identic cu identificatorul pe care îl utilizați pentru dequeueReusableCellWithIdentifier.

Publicat 17/06/2009 la 05:10
sursa de către utilizator

voturi
1

Aici este în Swift

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!
}
Publicat 24/10/2015 la 02:00
sursa de către utilizator

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