kopiëren UITableViewCell

stemmen
7

Ik lees een aangepaste tabel cel in tableView:cellForRowAtIndexPath:vanuit een penpunt bestand. Dit werkt prima voor mijn doeleinden, behalve dat het is nogal traag.

Nu, ik weet het juiste ding om te doen op de lange termijn is om de cel geheel te creëren in de code, en een enkele weergave gebruiken, en ga zo maar door. Maar dit is een prototype, en ik wil niet dat er veel moeite gestoken.

Voor nu, zou ik blij zijn als ik de punt aan het lezen was slechts eenmaal in de UIViewControllersubklasse, dan tableView:cellForRowAtIndexPath:kopieën maakte van. Mijn veronderstelling is dat het kopiëren sneller dan het lezen van de punt zou zijn.

Hier is wat ik gebruiken om de penpunt, die noem ik uit te laden viewDidLoad:(en retainna)

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

Alles is goed tot nu toe. Maar de vraag is: Hoe kan ik deze keer op keer te kopiëren? Is het zelfs mogelijk?

Ik heb geprobeerd [_cachedObject copy]en [_cachedObject mutableCopy]maar UITableViewCellbiedt geen ondersteuning voor beide kopie protocol.

Als het moet, kan ik alleen maar zeggen dat ze moeten de snelheid te negeren totdat ik ben bereid om de punt volledig te verwijderen, maar ik heb liever te krijgen gaat het een beetje sneller als er een laag hangende fruit hier.

Iemand een idee?

De vraag is gesteld op 20/02/2009 om 21:43
bron van user
In andere talen...                            


5 antwoorden

stemmen
8

Ik denk omgaan van tabel cel kan gebruikt worden samen met dequeuing mechanisme waarmee aan cellen eenmaal (bij punt of programmatisch of krijgt deze automatisch geladen uit andere penpunt en koppelen als uitlaatklep IB) en te klonen of ontbufferen te creëren wanneer nodig.

UITableViewCell niet aan NSCopying protocol, maar ondersteunt versleutelde archivering / de archivering ongedaan mechanisme, zodat het kan worden gebruikt voor klonering.

"Op basis van antwoord ? Hoe kan ik een UIButton dupliceren in Objective C " mijn gegevensbron delegeren methode eruit ziet:

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

En in mijn geval self.tableViewCell is een cel die één keer was geladen uit het zicht van de penpunt bestand.

Ik heb niet getest wat sneller zal zijn: "archive + unarchive" te klonen of "load penpunt file + unarchive" dat kader zal doen in geval van -loadNibNamed: eigenaar: options: , ik gebruikte deze methode alleen met gemak overwegingen, maar een goede kans dat het geheugen operatie vs file operatie sneller zal zijn.

EDIT: Het lijkt niet zo makkelijk als het leek op het eerste. Zoals UIImage niet voldoet aan NSCoding, cellen met geconfigureerde UIImageViews kan niet alleen gekopieerd zonder aanvullende code. Yep, gehele beeld te kopiëren is zeker niet een goede gewoonte, juicht aan Apple voor het wijzen dit.

antwoordde op 17/03/2011 om 13:00
bron van user

stemmen
6

Gebruik de cel klonen ingebouwd in de tabelweergave. Apple wist het genereren van een veel tabelcellen was traag. Bekijk de documentatie voor deze methode:

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

U maakt de cel een keer, dan als nieuwe cellen wordt gevraagd, gebruikt u die methode om de bestaande cellen te klonen. Dan moet je gewoon veranderen wat moet worden veranderd over de nieuwe cel en terug de cel object.

Lees ook de tabelweergave realted voorbeeldcode die door Apple dat deze methode gebruikt en tonen u de juiste manier. Het feit uw cel werd uit een penpunt geplaatst is, moet in het geheel niet toe.


Minor verduidelijking: Ik denk niet dat de bovenstaande methode kloon cellen voor jou. In plaats daarvan neemt celobjectinformatie die zijn verschoven van het scherm en eenvoudig verplaatst naar een nieuwe plek. Dus het is letterlijk hergebruiken van een cel. Dus zorg ervoor dat uw aangepaste tabel weergave kan worden ingesteld om alle de nieuwe waarden die het nodig heeft buiten de intialization.

antwoordde op 20/02/2009 om 22:11
bron van user

stemmen
4

Niet trots op deze oplossing, maar het werkt met het maximale aantal mogelijke IB bindingen:

Interface (AlbumTableViewCell een subklasse van UITableViewCell waarvan een voorbeeld wordt in AlbumViewController's XIB file):

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

@property (nonatomic, retain) AlbumTableViewCell *tableViewCellTrack;

Implementatie (unarchive / archief maakt een copy / klonen de tabelweergave cel):

@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;
}
antwoordde op 08/12/2009 om 10:06
bron van user

stemmen
3

Nou, ik ben niet zeker waarom alle tutorials die er niet deze stap te specificeren.

Bij het gebruik van uw eigen aangepaste UITableViewCell van Nib, roepen dequeueReusableCellWithIdentifier is niet genoeg. Je moet de "Identifier" in de IB te geven, alleen voor het op in het tabblad Cell Table View sectie.

Zorg dan dat de identifier je in IB is hetzelfde als de identifier die u gebruikt voor de dequeueReusableCellWithIdentifier.

antwoordde op 17/06/2009 om 05:10
bron van user

stemmen
1

Hier is het in 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!
}
antwoordde op 24/10/2015 om 02:00
bron van user

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