2009-10-24 1 views
2

J'ai eu un problème pour créer une liste de contrôle dans le style de l'exemple TouchCells à partir de l'exemple de code Apple. Fondamentalement, c'est une table qui permet la sélection multiple de ses éléments et donne une coche à chaque élément sélectionné. Le problème que j'ai est que lorsque je sélectionne un élément, puis défile vers le bas de l'écran, un autre élément (hors de l'écran) sera sélectionné au hasard. Il semble que c'est habituellement la prochaine cellule à charger sur l'écran.Problème de création d'une liste de contrôle (similaire à l'exemple de code TouchCells) pour l'iPhone. Les cellules aléatoires sont vérifiées

Je ne pouvais pas comprendre ce que je faisais mal donc je l'ai testé avec le code TouchCells d'Apple. Dans leur programme cependant, ils ont seulement 6 cellules et il n'y a pas de place pour faire défiler. Donc, j'ai dupliqué certains des éléments du fichier plist pour faire plus de cellules et ... le même problème apparaît. Si vous sélectionnez une cellule, puis faites défiler, une autre cellule sera sélectionnée au hasard.

Mise à jour J'ai récemment essayé l'exemple de code de Cook Dev iPhonebook nommé "Vérifie" et ... vous l'avez deviné, le même problème. Voici le lien: http://code.google.com/p/cookbooksamples/downloads/list

Cela me rend fou. Est-ce un bug ou est-ce que je fais quelque chose de mal? Est-ce que quelqu'un sait comment réparer ceci?

Merci!

En outre, quelqu'un connaît-il un exemple de code qui montre comment faire cela?

Répondre

1

J'ai un problème similaire avec un UITableViewCell personnalisé dans mon application. Selon les documents Apple sur prepareForReuse: "vous devriez seulement réinitialiser les attributs de la cellule qui ne sont pas liés au contenu, par exemple, l'alpha, l'édition et l'état de sélection."

L'exemple TouchCells est lié à l'état de sélection, mais utilise un booléen et des images pour simuler la sélection. Jusqu'à présent, la seule chose que j'ai trouvé à travailler est d'utiliser un identifiant de réutilisation unique pour chaque cellule. Kinda défait les objectifs de réutilisation, n'est-ce pas?

Par exemple, pour résoudre le problème dans l'exemple de TouchCells, remplacer:

static NSString *kCustomCellID = @"MyCellID"; 

avec:

NSString *kCustomCellID = [NSString stringWithFormat:@"MyCellID%d", indexPath.row]; 

Je suppose que cela est ok si vous avez un petit nombre de cellules, mais il y a doit être un meilleur moyen, non?

+0

Cela l'a résolu! Merci pour l'aide! – Jonah

3

Vous faites sans doute ceci:

if (whatever) { 
    cell.accessoryType = UITableViewCellAccessoryCheckMark; 
} 

Lorsque vous devez faire ceci:

if (whatever) { 
    cell.accessoryType = UITableViewCellAccessoryCheckMark; 
} else { 
    cell.accessoryType = UITableViewCellAccessoryNone; 
} 

Si vous utilisez une cellule personnalisée, vous pouvez remplacer prepareForeReuse:

- (void)prepareForReuse { 
    [super prepareForReuse]; 
    self.accessoryType = UITableViewCellAccessoryNone; 
} 
+1

J'avais l'habitude d'avoir ce problème, jusqu'à ce que j'ai vraiment réalisé ce qui se passait.Cela rend le textFields dans les cellules très amusant aussi (l'utilisateur entre le texte, fait défiler la cellule trop loin, revient en arrière et maintenant le texte est parti .. Oh le plaisir que vous aurez!) – jbrennan

+1

J'utilise une cellule personnalisée, mais couldn Ne pas comprendre comment implémenter prepareForReuse prioritaire. Pourriez-vous élaborer sur la façon dont vous faites ce travail? Merci pour l'aide! – Jonah

0

trouvé la solution après une douloureuse recherche en fin de soirée ...

Dans la fonction checkAction dans CustomCell.m (se référant à l'exemple de TouchCells) utiliser setBackgroundImage plutôt que setImage.

+0

De quel exemple parlez-vous? –

Questions connexes