Másolás UITableViewCell

szavazat
7

Olvasom egyéni cellájába tableView:cellForRowAtIndexPath:egy nib fájlban. Ez remekül működik én célokra, kivéve, hogy elég lassú.

Tudom, hogy a helyes dolog, hogy hosszú távon az, hogy megteremtse a cella teljesen kódot, és arra, hogy egyetlen nézetben, és így tovább. De ez egy prototípus, és nem akarom, hogy tegye, hogy sok erőfeszítést bele.

Most, örülnék, ha olvastam a hegy csak egyszer UIViewControlleralosztály, akkor tableView:cellForRowAtIndexPath:készült másolatai. Feltételezésem az, hogy a másolás gyorsabb lenne, mint az olvasás a hegy.

Itt van, amit használni lehet betölteni a tollhegy, amely hívom származó viewDidLoad:(és retainután)

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

Minden jó eddig. De a kérdés: Hogyan lehet átmásolni ezt újra és újra? Ez lehetséges?

Próbáltam [_cachedObject copy]és [_cachedObject mutableCopy]de UITableViewCellnem támogatja sem másolat protokollt.

Ha van, én is csak mondd meg nekik, hogy figyelmen kívül hagyja a sebességet, amíg kész vagyok, hogy távolítsa el a hegy teljesen, de én inkább ez megy egy kicsit gyorsabb, ha van egy kis lógó gyümölcs itt.

Bármilyen ötletet?

A kérdést 20/02/2009 21:43
a forrás felhasználó
Más nyelveken...                            


5 válasz

szavazat
8

Azt hiszem, megküzdési táblázat cella lehet használni együtt dequeuing mechanizmus, amely lehetővé teszi, hogy hozzon létre sejt egy idő (tollhegy vagy programozottan vagy kapok automatikusan betöltődik a többi tollhegy és összekapcsolása, mint egy üzletet IB), majd klónozza azt vagy dequeue meg amikor szükség van.

UITableViewCell nem felel meg NSCopying protokoll, de támogatja ékelt archiválás / archiválás megszüntetésével aktiválható mechanizmus, így lehet használni klónozás.

Válasz alapján „ Hogyan másolni egy UIButton Objective C? ” Én adatforrás küldötte módszer néz ki:

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

És az én esetemben self.tableViewCell olyan sejt, amely töltöttünk egy idő nézet tollhegy fájlt.

Nem tesztelt, mi lesz gyorsabb: „archív + archiválásuk” klónozni vagy „terhelés tollhegy fájl + archiválásuk”, amely keretet fog tenni esetén -loadNibNamed: tulajdonos: beállítások: én ezt a módszert csak a kényelem megfontolások, hanem esély arra, hogy a memória működését vs fájlműveletet gyorsabb lesz.

EDIT: Úgy tűnik, nem olyan egyszerű, mint amilyennek látszik az elején. Mivel UIImage nem felel meg NSCoding, sejtek konfigurált UIImageViews nem csak másolni anélkül, hogy további kódot. Ja, másolás egész kép egyáltalán nem jó gyakorlat, hurrá, hogy az Apple mutat erre.

Válaszolt 17/03/2011 13:00
a forrás felhasználó

szavazat
6

A következő sejtklónozási épített táblanézetet. Apple tudta generál egy csomó táblázatcellákat lassú volt. Nézze meg a docs ezt a módszert:

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

Hozza létre a sejt egyszer, majd mint az új sejtek kérte, ezt a módszert követi, hogy a klón a meglévő sejtek. Akkor csak megváltoztatni, amit meg kell változtatni az új cellát, és visszaadja a cella objektumot.

Érdemes megnézni a táblanézetet realted mintakódot Apple által biztosított, hogy használja ezt a módszert, és megmutatja a helyes utat. Az a tény, hogy a sejtek volt betöltve hegyet nem számít egyáltalán.


Kisebb pontosítás: Nem hiszem, a fenti módszer klón sejtekben az Ön számára. Ehelyett úgy sejt objektum lecsordult a képernyőn, és egyszerűen áthelyezi őket egy új helyszínen. Tehát ez a szó szoros értelmében újrafelhasználása egy cellába. Tehát biztos, az egyéni táblanézet lehet állítani, hogy minden új értékek szüksége kívül intialization.

Válaszolt 20/02/2009 22:11
a forrás felhasználó

szavazat
4

Nem büszke a megoldás, de működik a maximális lehetséges IB kötések:

Interface (AlbumTableViewCell egy alosztálya UITableViewCell amelynek egy példánya van definiálva AlbumViewController féle XIB fájl):

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

@property (nonatomic, retain) AlbumTableViewCell *tableViewCellTrack;

Végrehajtás (archiválásuk / archív másolatot / klón a táblázat nézet cella):

@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;
}
Válaszolt 08/12/2009 10:06
a forrás felhasználó

szavazat
3

Nos, nem vagyok benne biztos, hogy miért minden oktató ott nem határozza meg ezt a lépést.

Ha a saját egyéni UITableViewCell származó Nib, amelyben dequeueReusableCellWithIdentifier nem elég. Meg kell adnia a „Identifier” a IB, csak mert a Table View Cell lap listájában.

Ezután ellenőrizze az azonosító teszel IB megegyezik az azonosító használata az dequeueReusableCellWithIdentifier.

Válaszolt 17/06/2009 05:10
a forrás felhasználó

szavazat
1

Itt van a 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!
}
Válaszolt 24/10/2015 02:00
a forrás felhasználó

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