Lorsque j'appelle [tableView reloadData]
, la fonction - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
n'est pas déclenchée? Pourquoi?
Voici mon TableView.m
@implementation TableView
@synthesize managedObjectContext;
@synthesize controller = _controller;
@synthesize tableView = _tableView;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
}
return self;
}
-(id)init
{
self = [super init];
if (self) {
NSLog(@"%s",__PRETTY_FUNCTION__);
self.del = [[UIApplication sharedApplication] delegate];
self.managedObjectContext = self.del.managedObjectContext;
[self performControllerFetch];
}
return self;
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
...
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
...
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
...
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
...
}
-(void)reloadTableView
{
NSLog(@"%s",__PRETTY_FUNCTION__);
[self.tableView reloadData];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
NSLog(@"%s",__PRETTY_FUNCTION__);
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray
arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray
arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id )sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
switch(type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
// The fetch controller has sent all current change notifications, so tell the table view to process all updates.
[self.tableView endUpdates];
}
@end
TableView.h
@interface TableView : UITableView <UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate>
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong) AppDelegate *del;
@property (nonatomic, strong) NSFetchedResultsController *controller;
@property (weak, nonatomic) IBOutlet TableView *tableView;
-(void)reloadTableView;
-(void)performControllerFetch;
@end
On dirait que vous ne définissez jamais les propriétés delegate
et datasource
sur votre vue de table, non? Vous implémentez les méthodes dans ces protocoles dans tableview.m
mais vous ne définissez pas les deux propriétés sur self
et l'appelez donc reloadData
sans effet.
Est-ce que cela aide?
Edit:
Il semble que vous ayez une propriété tableView
définie sur une sous-classe de UITableView
et connectée à un fichier de générateur d'interface. C'est une configuration étrange (une table dans une table). Habituellement, vous aurez quelque chose comme une sous-classe UIViewController
connectée à un XIB et définissez une
@property (nonatomic, strong) IBOutlet UITableView * tableView
dans cette sous-classe, ou quelque chose de similaire. Ensuite, gérez l'extraction des données et le délégué/la source de données tableview dans la sous-classe viewcontroller.
Mais ici, à cause du UITableView
s imbriqué, ce n'est pas aussi simple. Y a-t-il une raison pour cette conception? Je recommande de passer à quelque chose comme je le décris ci-dessus pour aider à clarifier la configuration.
Essayez également d’ajouter des instructions NSLog
dans votre méthode init
pour voir si les propriétés tableview! = Nil et déléguée et source de données ont été définies. Je soupçonne que la connexion n'est pas établie.
En outre, indépendamment du problème rencontré, vous n’avez plus à manuellement @synthesize ivar = _ivar
, cela se fera automatiquement pour vous en utilisant la convention de soulignement.
J'avais le même problème, que le reload ne fonctionnait pas. Je crois que la méthode delegate à laquelle je l'appelais se trouvait dans un thread background qui était à l'origine du problème. Ma solution était de créer une nouvelle méthode (ci-dessous) et d'appeler le reload à partir de là, tout en veillant également à l'appeler à partir du main:
- (void) tocLoad {
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
}
Si vous ne pouvez pas recharger la table avec
[self.tableView reloadData];
Assurez-vous d’ajouter une référence à ce qui suit dans le storyboard.
@property (weak, nonatomic) IBOutlet TableView *tableView;
Comment ajouter une référence, vous pouvez cliquer sur le lien image suivant:
Cela m'est arrivé parce qu'il y avait un appel à
tableView.beginUpdates()
sans appel à
tableView.endUpdates()
Dans mon code Supprimer tableView.beginUpdates()
a résolu le problème pour moi.
J'ai passé des jours à déboguer ce problème et à trouver une tonne de solutions possibles. J'ai joué celui qui a fonctionné pour moi mais ils sont tous valables.
Tout d’abord, bien sûr, vérifiez que votre délégué, source de données, IBOutlet, etc. sont tous configurés correctement.
** Définissez le point d'arrêt Toutes les exceptions et voyez si vous obtenez une exception hors limites dans votre source de données. Sans définir le point d'arrêt, il n'y a pas de crash et la vue de la table ne pourra tout simplement pas recharger.
Autres corrections possibles: vérifiez le cadre de la table pour vous assurer que la largeur ou la hauteur n'est pas égale à 0. Essayez d'exécuter reloadData sur le thread principal. Enfin, essayez de ne recharger qu'une seule section ( ici ).
Je dois aimer les vues de la table.
En dépit de l’écriture de ce [self.tableView reloadData];
essai ci-dessous, parce que vous avez déjà écrit classe, vous n'avez donc pas besoin de reprendre la sortie:
[self reloadData]