Αντιγραφή UITableViewCell

ψήφοι
7

Διαβάζω ένα κελί προσαρμοσμένο πίνακα σε tableView:cellForRowAtIndexPath:από ένα αρχείο μύτη. Αυτό λειτουργεί μεγάλο για τους σκοπούς μου, εκτός του ότι είναι πολύ αργή.

Τώρα, ξέρω το σωστό πράγμα που κάνει σε μακροπρόθεσμη βάση είναι να δημιουργήσει το κύτταρο εξ ολοκλήρου στον κώδικα, και να χρησιμοποιούν μια ενιαία εικόνα, και ούτω καθεξής. Αλλά αυτό είναι ένα πρωτότυπο, και δεν θέλω να θέσω πολλή προσπάθεια σε αυτό.

Προς το παρόν, θα ήμουν ευτυχής αν διάβαζα την μύτη μόνο μία φορά στην UIViewControllerυποκατηγορία, τότε tableView:cellForRowAtIndexPath:γίνονται αντίγραφα από αυτό. Η υπόθεσή μου είναι ότι η αντιγραφή θα είναι ταχύτερη από την ανάγνωση της μύτης.

Εδώ είναι αυτό που μπορώ να χρησιμοποιήσω για να φορτώσει την μύτη, την οποία καλώ από viewDidLoad:(και retainμετά)

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

Όλα είναι καλά μέχρι στιγμής. Αλλά το ερώτημα είναι: Πώς μπορώ να αντιγράψω αυτό ξανά και ξανά; Είναι ακόμη δυνατό;

Προσπάθησα [_cachedObject copy]και [_cachedObject mutableCopy]όμως UITableViewCellδεν υποστηρίζει είτε το πρωτόκολλο αντίγραφο.

Αν έχω να, μπορώ να τους πω απλά να αγνοήσει την ταχύτητα μέχρι να είμαι έτοιμος για να αφαιρέσετε την μύτη εντελώς, αλλά θα προτιμούσα να πάρει αυτό που πηγαίνει λίγο πιο γρήγορα, αν υπάρχει μια χαμηλού κρέμεται φρούτα εδώ.

Καμιά ιδέα?

Δημοσιεύθηκε 20/02/2009 στις 21:43
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
8

Πιστεύω ότι η αντιμετώπιση της κελί του πίνακα μπορεί να χρησιμοποιηθεί μαζί με μηχανισμό dequeuing, η οποία θα επιτρέψει να δημιουργήσει κύτταρο ένα χρόνο (από κόκκους ή μέσω προγραμματισμού ή να πάρει το φορτώνονται αυτόματα από άλλα μύτη και συνδέοντας ως διέξοδο στην ΙΒ) και στη συνέχεια κλωνοποίηση αυτό ή dequeue αυτό όταν χρειαστεί.

UITableViewCell δεν συμμορφώνεται με το πρωτόκολλο NSCopying, αλλά υποστηρίζει πληκτρολογηθεί αρχειοθέτηση /-αρχειοθέτηση μηχανισμό, έτσι ώστε να μπορεί να χρησιμοποιηθεί για την κλωνοποίηση.

«Με βάση την απάντηση ; Πώς να αντιγράψετε ένα UIButton του στόχου C » μέθοδο εκπρόσωπος πηγή δεδομένων μου μοιάζει με:

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

Και στην περίπτωσή μου self.tableViewCell είναι ένα κύτταρο που φορτώθηκε ένα χρόνο από το αρχείο μύτη άποψη του.

Δεν ελεγχθεί ποια θα είναι ταχύτερη: «αρχείο + Κατάργηση αρχειοθέτησης» για την κλωνοποίηση ή «το αρχείο μύτη φορτίο + Κατάργηση αρχειοθέτησης», η οποία θα κάνει πλαισίου σε περίπτωση -loadNibNamed: ιδιοκτήτη: Επιλογές: , έχω χρησιμοποιήσει αυτή τη μέθοδο μόνο με λόγους ευκολίας, αλλά καλές πιθανότητες ότι η λειτουργία της μνήμης εναντίον της λειτουργίας του αρχείου θα είναι ταχύτερη.

EDIT: Δεν φαίνεται τόσο εύκολο όσο φαινόταν στην αρχή. Όπως UIImage δεν συμμορφώνεται με NSCoding, κύτταρα με διαμορφωθεί UIImageViews δεν μπορεί να αντιγραφεί μόνο χωρίς πρόσθετο κωδικό. Ναι, αντιγράφοντας ολόκληρη την εικόνα δεν είναι σίγουρα μια καλή πρακτική, ζήτω στην Apple για την υπόδειξη αυτή.

Απαντήθηκε 17/03/2011 στις 13:00
πηγή χρήστη

ψήφοι
6

Χρησιμοποιήστε την κλωνοποίηση κυττάρων ενσωματωμένη προβολή πίνακα. Η Apple γνώριζε δημιουργώντας πολλά κελιά πίνακα ήταν αργή. Ελέγξτε τις docs για τη μέθοδο αυτή:

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

Μπορείτε να δημιουργήσετε το κελί φορά, στη συνέχεια, όπως ζητούνται νέα κύτταρα, χρησιμοποιούν αυτή τη μέθοδο για να κλωνοποιήσουν τα υπάρχοντα κύτταρα. Στη συνέχεια, μπορείτε απλά να αλλάξετε το τι πρέπει να αλλάξει για το νέο κύτταρο και να επιστρέψει το αντικείμενο των κυττάρων.

Επίσης, ελέγξτε έξω την άποψη πίνακα συνδεόμενους δείγμα κώδικα που παρέχεται από την Apple που χρησιμοποιεί αυτή τη μέθοδο και να σας δείξει τον σωστό τρόπο. Το γεγονός κινητό σας φορτώθηκε από μια μύτη δεν πρέπει να πειράξει καθόλου.


Μικρά διευκρίνιση: δεν σκέφτομαι τα παραπάνω μέθοδο κλώνο κυττάρων για εσάς. Αντ 'αυτού, παίρνει αντικείμενο των κυττάρων που έχουν μεταβεί από την οθόνη και απλά να τους μετακινεί σε μια νέα θέση. Έτσι είναι κυριολεκτικά επαναχρησιμοποίηση ένα κελί. Έτσι να είστε βέβαιος προσαρμοσμένη προβολή τραπέζι σας μπορεί να ρυθμιστεί σε όλες τις νέες αξίες που χρειάζεται εκτός της αρχικοποίησης.

Απαντήθηκε 20/02/2009 στις 22:11
πηγή χρήστη

ψήφοι
4

Δεν είναι υπερήφανοι για αυτή τη λύση, αλλά λειτουργεί με το μέγιστο αριθμό των πιθανών δέστρες ΙΒ:

Interface (AlbumTableViewCell είναι μια υποκατηγορία των UITableViewCell των οποίων ένα παράδειγμα ορίζεται στο αρχείο ΧΙΒ AlbumViewController του):

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

@property (nonatomic, retain) AlbumTableViewCell *tableViewCellTrack;

Εφαρμογή (Κατάργηση αρχειοθέτησης / αρχείο κάνει ένα αντίγραφο / κλώνους του κυττάρου προβολή πίνακα):

@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;
}
Απαντήθηκε 08/12/2009 στις 10:06
πηγή χρήστη

ψήφοι
3

Λοιπόν, δεν είμαι σίγουρος γιατί όλα τα μαθήματα εκεί έξω δεν προσδιορίζει αυτό το βήμα.

Όταν χρησιμοποιείτε τη δική σας προσαρμοσμένη UITableViewCell από κόκκους, καλώντας dequeueReusableCellWithIdentifier δεν είναι αρκετό. Θα πρέπει να καθορίσετε το «Identifier» στο IB, μόνο για για αυτό το τμήμα καρτέλας κυττάρων Table View.

Στη συνέχεια, βεβαιωθείτε ότι το αναγνωριστικό σας βάλει σε IB είναι το ίδιο με το αναγνωριστικό που χρησιμοποιείτε για την dequeueReusableCellWithIdentifier.

Απαντήθηκε 17/06/2009 στις 05:10
πηγή χρήστη

ψήφοι
1

Εδώ είναι το 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!
}
Απαντήθηκε 24/10/2015 στις 02:00
πηγή χρήστη

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