Kopieren UITableViewCell

stimmen
7

Ich lese eine benutzerdefinierte Tabellenzelle in tableView:cellForRowAtIndexPath:einer Nib - Datei. Dies funktioniert gut für meine Zwecke, außer es ziemlich langsam ist.

Jetzt weiß ich, das Richtige auf lange Sicht zu tun ist, um die Zelle vollständig in Code zu erstellen, und eine einzige Ansicht zu verwenden, und so weiter. Aber dies ist ein Prototyp, und ich will nicht, dass viel Mühe hineingesteckt.

Denn jetzt, würde ich glücklich sein , wenn ich um die Spitze in der nur einmal zu lesen war UIViewControllerUnterklasse, dann tableView:cellForRowAtIndexPath:machte Kopien davon. Meine Annahme ist hier, dass das Kopieren schneller sein würde als die Spitze zu lesen.

Hier ist , was ich die Feder zu laden verwenden , um, die ich rufe aus viewDidLoad:(und retainnach)

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

Alles ist gut so weit. Aber die Frage ist: Wie kopiere ich das immer und immer? Ist es überhaupt möglich?

Ich habe versucht , [_cachedObject copy]und [_cachedObject mutableCopy]doch UITableViewCellnicht so oder Kopie - Protokoll unterstützen.

Wenn ich habe, kann ich ihnen sagen, nur um die Geschwindigkeit zu ignorieren, bis ich bereit bin die Spitze vollständig zu entfernen, aber ich würde lieber bekomme es etwas schneller gehen, wenn es Frucht eine niedrig hängende ist hier.

Irgendwelche Ideen?

Veröffentlicht am 20/02/2009 um 21:43
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
8

Ich denke Bewältigung von Tabellenzelle kann zusammen mit Ausreihen Mechanismus verwendet werden, die Zelle eine Zeit erstellen können (aus nib oder programmatisch oder sich automatisch von anderen nib geladen und die Verknüpfung als Auslass in IB) und dann klonen oder es dequeue wenn gebraucht.

UITableViewCell entspricht nicht NSCopying Protokoll, aber es unterstützt die Schlüsselarchivierung / Aufheben der Archivierung von Mechanismus, so kann es für das Klonen verwendet werden.

„Basierend auf Antwort ? Wie ein UIButton in Objective C duplizieren “ meine Datenquelle Delegatmethode wie folgt aussieht:

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

Und in meinem Fall self.tableViewCell ist eine Zelle , die eine Zeit aus dem Blickfeld der Nib - Datei geladen wurde.

Ich habe nicht getestet , was schneller ist: „Archiv + unarchive“ zu klonen oder „load Nib - Datei + unarchive“ , der Rahmen für den Fall tun wird von -loadNibNamed: Besitzer: Optionen: Ich habe diese Methode nur mit Bequemlichkeit Überlegungen, aber gute Chancen , dass Speicheroperation vs Dateioperation wird schneller sein.

EDIT: Es scheint nicht so einfach, wie es zunächst schien. Wie UIImage zu NSCoding entspricht nicht, Zellen mit konfiguriert UIImageViews kann nicht einfach ohne zusätzlichen Code kopiert werden. Yep, ganzes Bild zu kopieren ist definitiv keine gute Praxis, cheers an Apple für diesen Hinweis.

Beantwortet am 17/03/2011 um 13:00
quelle vom benutzer

stimmen
6

Verwenden Sie die Zellklonierung in der Tabellenansicht gebaut. Apple kannte viele Tabellenzellen zu erzeugen war langsam. Schauen Sie sich die Dokumentation für diese Methode:

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

Sie erstellen, sobald die Zelle, dann als neue Zellen angefordert werden, verwenden diese Methode die vorhandenen Zellen zu klonen. Dann ändern Sie genau das, was über die neue Zelle geändert werden muss und gibt die Zelle Objekt.

Sie können auch die Tabellenansicht realted Beispielcode von Apple zur Verfügung gestellt, die diese Methode verwendet und zeigen Ihnen den richtigen Weg. Die Tatsache, Ihre Zelle aus einer Feder geladen wurde sollte keine Rolle.


Minor Klarstellung: Ich denke nicht, die oben genannte Methode Klonzellen für Sie. Stattdessen nimmt es Zelle-Objekt, das aus dem Bildschirm gescrollt hat und einfach verschiebt sie an eine neue Stelle. So buchstäblich es die Wiederverwendung einer Zelle. So sicher sein, Ihre Ansicht benutzerdefinierte Tabelle kann auf alle neuen Werte eingestellt werden, es außerhalb des intialization muss.

Beantwortet am 20/02/2009 um 22:11
quelle vom benutzer

stimmen
4

Nicht stolz auf diese Lösung, aber es funktioniert mit der maximalen Anzahl von möglichen IB-Bindungen:

Interface (AlbumTableViewCell ist eine Unterklasse von UITableViewCell von denen eine Instanz in AlbumViewController der XIB-Datei definiert ist):

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

@property (nonatomic, retain) AlbumTableViewCell *tableViewCellTrack;

Implementation (unarchive / Archiv erstellt eine Kopie / Klone die Tabellenansicht Zelle):

@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;
}
Beantwortet am 08/12/2009 um 10:06
quelle vom benutzer

stimmen
3

Nun, ich bin mir nicht sicher, warum alle Tutorials gibt diesen Schritt nicht spezifiziert.

Wenn Sie Ihre eigene benutzerdefinierte UITableViewCell aus Nib verwenden, dequeueReusableCellWithIdentifier Aufruf ist nicht genug. Sie haben die „Identifier“ im IB angeben, nur für es in der Tabellenansicht Registerkarte Zelle Abschnitt.

Dann stellen Sie sicher, die Kennung Sie in IB setzen ist das gleiche wie die Kennung, die Sie für die dequeueReusableCellWithIdentifier verwenden.

Beantwortet am 17/06/2009 um 05:10
quelle vom benutzer

stimmen
1

Hier ist es 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!
}
Beantwortet am 24/10/2015 um 02:00
quelle vom benutzer

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