UITableViewCell cellForRowAtIndexPath appeler grand nombre de lignes lors de la première de défilement
J'ai travaillé sur un problème relatif à la UITableView et cellForRowAtIndexPath.
Je veux donner à l'utilisateur la possibilité d'avoir un très grand nombre de lignes, un peu comme une grande liste d'e-mail sur iPhone. J'ai découvert ce problème quand j'ai commencé à créer une classe qui aurait et de file d'attente file d'attente des groupes d'enregistrements de la base de données, en tant que de besoin, afin d'économiser de la mémoire. J'ai constaté que lorsque mon UITableViewController des charges, il appelle ensuite cellForRowAtIndexPath pour la première 10 index (0 à 9). Le problème apparaît lorsque je cliquer sur ma souris sur le simulateur du noir à la surface externe de la zone ou je tente de faire défiler vers le bas sur la UITableView à l'aide d'un geste vers le haut. À ce stade, cellForRowAtIndexPath est appelée pour tous les autres indices. Cela se produit même si il y a+ de 1000 cellules. J'ai tenté de recréer un projet TRÈS SIMPLE avec seulement 100 index (rien de compliqué). Il fait exactement la même chose.. dès que j'ai défiler, il appelle cellForRowAtIndexPath de positions 10 à 99.
Est-ce le comportement normal d'un UITableView? Est-ce quelqu'un n'importe qui ont des idées de pourquoi il est inefficace à l'appel de toutes les lignes?
Je dirai que, une fois ce passage initial se produit, il semble que cela commence à fonctionner correctement. Je suis vraiment intrigué par ce parce qu'il est presque impossible de créer une classe pour les les d'attente et de file d'enregistrements en tant que de besoin.
Voici le code qui ma beaucoup plus simple exemple de projet:
//Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
//Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 100;
}
//Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
printf("RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.row = %d\n", indexPath.row);
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
cell.textLabel.text = @"Example Text";
return cell;
}
Console:
......
Chargement Initial de Vue
......
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 0
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.row = 1
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.row = 2
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.row = 3
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.row = 4
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.row = 5
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 6
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 7
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 8
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 9
......
Premier Geste De Défilement
......
ootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 11
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 12
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 13
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 14
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 15
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 16
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 17
.
.
J'ai enlevé un peu ici pour la raccourcir jusqu'
.
.
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 97
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 98
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 99
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 10
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 11
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 12
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 13
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 14
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 15
RootViewController, -tableView:cellForRowAtIndexPath; //indexPath.ligne = 16
(gdb)
Merci pour votre aide.
Eric
Modifier (jour suivant) --> aujourd'Hui, j'ai pensé à essayer un périphérique réel au lieu de mon simulateur. Mon iPhone 3GS ne pas reproduire ce comportement étrange. Je crois qu'il pourrait y avoir quelque chose de mal avec le simulateur sur ma machine. J'ai l'intention d'essayer un autre MAC quand le temps le permet.
OriginalL'auteur geekinit | 2010-10-27
Vous devez vous connecter pour publier un commentaire.
La cause de ce problème est une application que j'ai installé sur mon Mac appelé jeu d'enfant.
Cinch est une fenêtre de gestion de l'application qui ajoute un windows "snap" pour Mac OS. Le programme fonctionne très bien sinon. Chaque fois que je travaille avec cellForRowAtIndex chemin, je vais juste penser à désactiver Cinch.
Malheureusement, j'ai dû recharger la totalité de mon ordinateur pour comprendre cela! Espérons que cela est utile à quelqu'un d'autre rencontre ce bizarre fonctionnalité.
Vous êtes mon héros! Je n'ai jamais compris cela. Je vous remercie beaucoup.
veuillez sélectionner votre réponse
Merci man, vous êtes épique!
WOW! Merci beaucoup! Quelqu'un a-t informer les développeurs du jeu d'enfant?
OriginalL'auteur geekinit
juste au cas où que quelqu'un a le même problème étrange et n'a pas de programme comme chinch installé: le même comportement se produit si vous n'utilisez pas vraiment une personne cellidentifier.. si vous venez d'utiliser la norme-identificateur de apple exemples, alors il ne fonctionnera pas.
chaque fois que vous faites glisser votre tableview il y a des entrées tourne autour de. vous avez pour faire de votre cellule identificateurs uniques pour chaque cellule. ex.:
il m'a fallu un certain temps pour comprendre cela.. donc si quelqu'un trouve ce fil comme moi lors de la recherche pour "uitableview uitableviewcell comportement étrange ligne mettez le contenu sur la touche slide" qu'il a pu vérifier cette possible source d'erreur..
dequeueReusableCellWithIdentifier
. Ainsi, au lieu de l'instanciation d'un lot de cellules, vous il vous suffit d'instancier autant que nécessaire, c'est que beaucoup de qui sont visibles. Si vous donnez à chaque cellule unique réutilisation identificateur vous n'êtes pas la réutilisation de vos cellules.hmm... alors s'il vous plaît dites-moi, comment je dois remplir ma cellule avec des données? Je le fais dans la cellForRowAtIndexPath méthode. J'ai créer la cellule pour le correspondant de ligne et ajouter des étiquettes de données. lorsque la cellule est hors de la vue des autres cellules sont affectées et rempli avec des données. si l'utilisateur fait défiler jusqu'à nouveau à la première cellule, il est retiré de la dequeueReusableCellWithIdentifier méthode. de sorte que chaque cellule est réutilisé, lorsqu'ils sont présentés de nouveau. comment auriez-vous fait otherwiese? juste une cellule de l'objet avec l'évolution des contenus?
ok, je l'ai testé à nouveau.. il me semble que je me trompe, ça semble fonctionner maintenant. j'avais peut-être un autre problème dans mon code, qui est actuellement disparu..
De cette façon, vous utilisez un objet de cellule avec une seule ligne. De cette façon, vous avez besoin d'autant de cellules que les lignes de votre tableau. La cellule de réutilisation mécanisme vous permettent de réutiliser un objet de cellule avec plusieurs lignes. Lorsqu'une cellule se passe hors de l'écran, il peut être utilisé pour afficher une autre ligne. Si vos lignes se mélangent lors du défilement de l'affichage de la table est parce que vous n'êtes pas de compensation de la "vieille" contenu lors de la réutilisation d'une cellule
Devrait vraiment supprimer cette réponse.
OriginalL'auteur dac
utilisateur de ce néant pour reuseidentifier de sorte qu'il fonctionne correctement
OriginalL'auteur jayesh kavathiya