copie UITableViewCell

voix
7

Je lis une cellule de tableau personnalisé dans tableView:cellForRowAtIndexPath:d'un fichier nib. Cela fonctionne très bien pour mes fins, sauf qu'il est assez lent.

Maintenant, je sais que la bonne chose à faire à long terme est de créer la cellule entièrement dans le code, et d'utiliser une seule vue, et ainsi de suite. Mais c'est un prototype, et je ne veux pas mettre beaucoup d'efforts.

Pour l' instant, je serais heureux si je lisais la plume une seule fois dans la UIViewControllersous - classe, puis tableView:cellForRowAtIndexPath:fait des copies de celui - ci. Mon hypothèse est que la copie serait plus rapide que la lecture de la pointe.

Voici ce que j'utilise pour charger la plume, que j'appelle de viewDidLoad:(et retainaprès)

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

Tout est bon jusqu'à présent. Mais la question est: Comment puis-je copier encore et? Est-il même possible?

J'ai essayé [_cachedObject copy]et [_cachedObject mutableCopy]mais UITableViewCellne supporte pas non plus le protocole de copie.

Si je dois, je peux leur dire de ne pas tenir compte de la vitesse jusqu'à ce que je suis prêt à retirer la plume tout à fait, mais je préfère le faire aller un peu plus vite s'il y a un fruit à faible pendaison ici.

Des idées?

Créé 20/02/2009 à 21:43
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
8

Je pense adaptation de cellule de table peut être utilisé conjointement avec le mécanisme de dequeuing, ce qui permettra de créer des cellules une fois (de pointe ou par programmation ou l'obtenir automatiquement chargé à partir d'autres nib et la liaison comme une sortie dans IB) et ensuite cloner ou dequeue il si nécessaire.

UITableViewCell ne se conforme pas au protocole NSCopying, mais il prend en charge le mécanisme d'archivage / désarchivage à clé, il peut donc être utilisé pour le clonage.

« Sur la base de réponse ? Comment dupliquer un UIButton en Objective C » ma méthode déléguée de source de données ressemble à :

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

Et dans mon cas self.tableViewCell est une cellule qui a été chargée une fois à partir du fichier nib de vue.

Je ne suis pas testé ce sera plus rapide: « archives + décompressez » pour cloner ou « fichier nib de charge + décompressez » quel cadre fera en cas de -loadNibNamed: propriétaire: Options: , j'utilisé cette méthode uniquement avec des considérations de commodité, mais de bonnes chances que le fonctionnement de la mémoire vs opération de fichier sera plus rapide.

EDIT: Il ne semble pas aussi facile qu'il semblait au premier abord. Comme UIImage ne se conforme pas à NSCoding, les cellules avec UIImageViews configurées ne peuvent pas être copiés sans que le code supplémentaire. Oui, la copie image entière est certainement pas une bonne pratique, des vivats à Apple pour l'avoir signalé.

Créé 17/03/2011 à 13:00
source utilisateur

voix
6

Utilisez le clonage cellulaire intégré dans la vue de la table. Apple a su générer un grand nombre de cellules de table a été lente. Consultez la documentation de cette méthode:

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

Vous créez la cellule une fois, puis en tant que de nouvelles cellules sont demandées, utiliser cette méthode pour cloner les cellules existantes. Ensuite, vous venez de changer ce qui doit être changé au sujet de la nouvelle cellule et retournez l'objet cellulaire.

Consultez également l'affichage du tableau exemple de code Realted fourni par Apple qui utilise cette méthode et vous montrer le droit chemin. Le fait que votre cellule a été chargée à partir d'une plume ne devrait pas question du tout.


petite précision: Je ne pense pas que les cellules clone de méthode ci-dessus pour vous. Au contraire, il prend un objet cellulaire qui ont sorti de l'écran et les déplace simplement un nouveau spot. Il est donc réutiliser littéralement une cellule. Assurez-vous donc votre point de vue de la table personnalisée peut être définie sur toutes les nouvelles valeurs dont il a besoin en dehors de l'initialisation.

Créé 20/02/2009 à 22:11
source utilisateur

voix
4

Pas fier de cette solution, mais il fonctionne avec le nombre maximum de liaisons possibles IB:

Interface (AlbumTableViewCell est une sous-classe de UITableViewCell dont une instance est définie dans le fichier de AlbumViewController XIB):

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

@property (nonatomic, retain) AlbumTableViewCell *tableViewCellTrack;

La mise en œuvre (décompressez / archive fait une copie / clones de la vue de la table cellulaire):

@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;
}
Créé 08/12/2009 à 10:06
source utilisateur

voix
3

Eh bien, je ne sais pas pourquoi tous les tutoriels il ne précise pas cette étape.

Lorsque vous utilisez votre propre UITableViewCell personnalisé à partir Nib, appelant dequeueReusableCellWithIdentifier ne suffit pas. Vous devez spécifier le « Identifier » dans l'IB, juste pour pour dans le Tableau section de l'onglet Cell.

Ensuite, assurez-vous que l'identifiant que vous mettez dans IB est le même que l'identifiant que vous utilisez pour la dequeueReusableCellWithIdentifier.

Créé 17/06/2009 à 05:10
source utilisateur

voix
1

Ici, il est à 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!
}
Créé 24/10/2015 à 02:00
source utilisateur

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