UITableview dans UITableviewcontroller - cellforrowatindexpath pas appelé sur reload
Je suis coincé dans un stupide problème depuis deux jours. J'ai un UITableViewController
poussé dans Navigation Controller
. Quand il charge, car il n'y a pas de données, afin de vider le tableau est visible:
Mais quand je reçois des données à partir du serveur, et de les appeler [self.tableView reloadData]
, à la fois numberOfRowsInSection
et heightForRowAtIndexPath
obtenir invoquer l'exception cellForRowAtIndexPath
et mon contrôleur est montré sans table:
Je ne peux pas vraiment comprendre pourquoi cela se produit. Tous les source de données méthodes sont appelées à l'exception de cellForRowAtIndexPath
. Il vous plaît quelqu'un me guider... Merci..
ActLogController.h
@interface ActLogController : UITableViewController<ASIHTTPRequestDelegate,UITableViewDataSource,UITableViewDelegate>
@property(strong) NSMutableArray *activityKeys;
@end
ActLogController.m
- (void)viewDidLoad
{
[super viewDidLoad];
activityKeys = [[NSMutableArray alloc] init];
self.tableView.dataSource = self;
}
-(void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self retrieveActivityLogFromServer];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return activityKeys.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
//Configure the cell...
ActivityLogUnit *act = [activityKeys objectAtIndex:indexPath.row];
cell.textLabel.text = act.price;
return cell;
}
-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 50.0;
}
-(void) requestFinished:(ASIHTTPRequest *)request
{
NSArray *list = [request.responseString JSONValue];
for (int i = 0; i < list.count; i++) {
NSArray *singleTrade = [[list objectAtIndex:i] JSONValue];
ActivityLogUnit *unit = [[ActivityLogUnit alloc] init];
unit.symbol = [singleTrade objectAtIndex:0];
unit.type = [singleTrade objectAtIndex:1];
unit.price = [singleTrade objectAtIndex:2];
unit.volTraded = [singleTrade objectAtIndex:3];
unit.remVol = [singleTrade objectAtIndex:4];
unit.actualVol = [singleTrade objectAtIndex:5];
unit.recordID = [singleTrade objectAtIndex:6];
unit.orderNo = [singleTrade objectAtIndex:7];
unit.time = [singleTrade objectAtIndex:8];
[activityKeys addObject:unit];
}
if(activityKeys.count > 0)
{
[self.tableView reloadData];//it is called and I have got 6 items confirm
}
}
MODIFIER
J'ai mis une certaine mannequin de données dans mon tableau activityKeys
, les Données sont affichées dans le tableau, et cellforrowatindexpath
est appelé avec succès. Mais comme je l'ai récupérer les données après un certain temps, d'autres méthodes sont appelées à l'exception de celle de table et disparaît, comme indiqué dans la 2e pic. Des idées?
Journal activityKeys.le comte de numberOfRowsInSection pour voir de quoi il en retourne.
Je n'ai pas de fichier xib pour mon tableviewcontroller.
son retour 6. Étonnamment
heightForRowAtIndexPath
est appelé 6 fois, mais cellforrow.. au temps zéro.C'est très curieux, je ne peux pas penser à une raison quelconque que cellForRowAtIndexPAth ne serait pas appelé aussi longtemps que numberOfRowsInSection renvoie un nombre supérieur à 0. Vous pouvez poster votre projet quelque part?
OriginalL'auteur NightFury | 2013-07-12
Vous devez vous connecter pour publier un commentaire.
Votre problème est probablement que vous téléchargez le contenu des données sur un thread d'arrière-plan. Puisque vous ne pouvez pas mettre à jour l'INTERFACE utilisateur sur un arrière-plan vous avez besoin de les appeler [self.tableView reloadData] sur le thread principal une fois que le téléchargement est terminé!
Espère que cela aide!
Votre réponse m'a aidé! Ma solution était d'utiliser performSelectorOnMainThread à reloadData.
OriginalL'auteur Groot
Vous ressemble dans le thread secondaire, ne reloadData dans le thread principal en utilisant code suivant
Vous pouvez toujours utiliser [NSThread isMainThread] pour vérifier si vous êtes dans le thread principal ou pas.
Une vérification générale, êtes-vous sûr cellForRowAtIndexPath n'est pas chargé? les points d'arrêt.. NSLog..
Oui, j'ai utilisé les deux et vérifié qu'elle n'est pas invoquée.
Plz vérifier mon édité Q.
Vous pouvez remplacer reloadData appel avec [auto.tableView performSelector:@selector(reloadData) withObject:néant afterDelay:0.5]; //délai pour éviter le multi-threading questions
OriginalL'auteur shahid-rasheed
vous devez écrire dans le viewdidload
Modifier
Vous n'avez pas xib alors où vous êtes déclaré/jeux de votre tableview propriétés. Comme
Essayer avec
voir mon édité répondre
Je n'ai pas xib, mais toujours d'abord le tableau a été montré (1ère photo) et aussi de référence est affecté. J'ai aussi essayé ta réponse mais elle ne m'aide pas 🙁
lorsque votre recharger tableview à l'époque numberOfRowsInSection méthode appelée? ou pas? si on l'appelle alors l'impression que ça compte.
Oui elle est appelée. le comte est de 6 après rechargement.
OriginalL'auteur SAMIR RATHOD
Tout d'abord, je crois fermement que le nom de l'instance de la tableview ne doit pas être similaire à la variable locale (c'est à dire tableView dans la classe ne doit pas être égal à tableView dans délégué de source de données et méthodes).
Seconde dans votre question posté je ne pouvais pas voir le délégué ensemble pour l'affichage de la table.
réponse Posté Par Samir Rathod devrait fonctionner si vous avez @bien pour l'affichage de la table définie dans vous .h ou .m fichier.
Vous pouvez également le faire si vous avez un fichier XIB.
Appuyez sur ctrl et cliquez sur + faire glisser le tableview pour les fichiers propriétaire et définissez le délégué et la source de données.
avez-vous enregistré les chiffres du tableau??? Je sais que vous avez mentionné ci-dessus. mais si c'est le cas n'importe quel nombre supérieur à 0 doit appeler le cellForRowAtIndex. Il y a probablement un très petit pas que vous devez être en manque. Essayez de diagnostiquer les étapes à nouveau.
OriginalL'auteur Apple_iOS0304
Pour moi le problème était mon extraite code de retour 0 comme le nombre de sections (de sorte qu'il n'a jamais demandé le nombre de lignes dans la section, et n'a jamais eu de leurs données). Il suffit de changer qui à 1 si c'est votre problème. En outre, je travaillais dans Swift, où le problème mentionné par @shahid-rasheed est codé (légèrement) différente:
OriginalL'auteur Michael
Enfin je l'ai travaillé.
cellForRowAtIndexPath
n'a pas été appelé en raison d'une ligne de code je n'ai pas mentionné ici... qui était en fait la suppression de la couleur calque d'arrière-plan de la vue. Il était à l'origine de rechargement question. Après l'avoir supprimé, tout fonctionne bien.Merci à vous tous pour votre collaboration 🙂
OriginalL'auteur NightFury
J'ai eu les mêmes symptômes. Dans mon cas, la première fois que j'ai chargé les données (à partir de la base de données) dans le viewDidLoad, NSSortDescriptor a été utilisé pour trier les données.
Sur le clic d'un bouton, la base de données ont été extraites de nouveau (cette fois avec des changements) et tableView données reloaded. Au départ, il m'a donné un tableau vierge vue après que le bouton a été cliqué parce que j'ai oublié de trier les données de la deuxième fois, je l'ai récupéré.
Points d'apprentissage: n'oubliez pas d'appeler toutes les méthodes qui modifient la cellule (comme la couleur d'arrière-plan mentionné par iAnum, ou NSSortDescriptor dans mon cas) si vous les avez utilisées dans la le début!!!
OriginalL'auteur Yan Yi