2010-11-27 16 views
2

alors j'ai suivi this guide ("La technique du contenu de lignes statiques") pour créer mes propres UITableViewCell personnalisés qui contiendraient une image.La cellule personnalisée créée avec IB est masquée après l'appel de reloadSections: withRowAnimation:

Le code suivant est extrait de ma méthode tableView:cellForRowAtIndexPath::

UIImageView *imageView = (UIImageView *)[imageViewCell viewWithTag:1]; 
imageView.image = [UIImage imageNamed:imageName]; 
cell = imageViewCell; 
NSLog(@"%@", cell); 
... 
return cell; 

imageViewCell fait référence à ma cellule personnalisée créée dans le constructeur d'interface. Comme vous pouvez le voir, j'essaie de changer d'image à chaque fois.

Tout fonctionne très bien, mais si je l'utilise reloadSections:withRowAnimation: sur le UITableView, cette cellule disparaît.

est ici la sortie de la console:

<UITableViewCell: 0x9c68fe0; frame = (0 0; 302 215); autoresize = RM+BM; layer = <CALayer: 0x4b88110>> 
<UITableViewCell: 0x9c68fe0; frame = (0 120; 320 102); autoresize = W; layer = <CALayer: 0x4b88110>> 
<UITableViewCell: 0x9c68fe0; frame = (-320 120; 320 102); alpha = 0; autoresize = W; layer = <CALayer: 0x4b88110>> 
<UITableViewCell: 0x9c68fe0; frame = (-320 121; 320 105); alpha = 0; autoresize = W; layer = <CALayer: 0x4b88110>> 
<UITableViewCell: 0x9c68fe0; frame = (-320 120; 320 111); alpha = 0; autoresize = W; layer = <CALayer: 0x4b88110>> 

Donc, comme vous pouvez le voir et l'alpha est cadre est changé à des valeurs étranges et reste comme ça.

Cela est logique, parce que je ne suis pas initialisant chaque fois à nouveau, il est initialisés qu'une seule fois après le réveil de pointe.

Comment réinitialiser ses attributs pour le rendre visible à nouveau? J'ai trouvé la méthode appelée prepareForReuse, mais cela n'a pas fonctionné. J'ai besoin de quelque chose qui réinitialiserait alpha et frame pour le faire apparaître à nouveau.


Solution avec pointe de chargement à chaque fois

Pour être plus clair sur ma première approche: j'ai créé la cellule de tableau d'affichage dans la pointe du contrôleur de vue. J'ai mis en place un point de vente, donc je pourrais l'utiliser dans tableView:cellForRowAtIndexPath:.

Comme les attributs de la cellule étaient foirés après l'animation, je pensais que recréer cette cellule aiderait définitivement. Le problème était que mon nib était chargé une seule fois et que je (encore) ne savais pas comment faire quelque chose comme la réinitialisation sur une vue qui a été initialisée par le fichier nib.

ai donc décidé de créer un nouveau fichier nib et le charger à chaque fois. Ce n'est pas exactement ce que je cherchais, mais ça marche. Voici ce que le code ressemble, il est très simple:

[[NSBundle mainBundle] loadNibNamed:@"TestTableCell" owner:self options:nil]; 
UIImageView *imageView = (UIImageView *)[imageViewCell viewWithTag:1]; 
imageView.image = [UIImage imageNamed:imageName]; 
cell = imageViewCell; 
imageViewCell = nil; // imageViewCell is still an outlet and setting 
        // it to nil makes the nib load it again the next 
        // time - so I'm sure I'll get a new instance. 
cell.selectionStyle = UITableViewCellSelectionStyleNone; 

Répondre

0

La cellule est en train de disparaître parce que quelque chose est en train de changer son cadre tel qu'il se finit par tirer hors de l'écran.

Si la taille de l'image change, la vue de l'image elle-même est paramétrée sur autoresize et la vue de contenu de la cellule de table le fait également, ce qui peut provoquer la migration des images de la cellule selon l'ordre de chargement des images.

+0

Des suggestions sur comment résoudre ce problème? Le chargement de la plume à chaque fois serait probablement utile, car cela réinitialiserait la position de la cellule et tout. Mais j'espérais vraiment une solution plus facile. – Vojto

+0

J'irais dans IB et réglerais la vue d'image pour ne pas autoresize.Si vous en avez besoin pour redimensionner, vous devrez peut-être le faire manuellement avant de définir l'image. – TechZen

3

En utilisant reloadSections:withRowAnimation: avec UITableViewRowAnimationNone résout effectivement le problème pour moi, et il montre encore l'animation sur l'ajout/suppression de cellules de la section.

Je crois toujours, que c'est un bug dans UIKit.

+0

J'ai 2 lignes à insérer/supprimer et UITableViewRowAnimationNone laisse demi-lignes visibles. – malhal