web-dev-qa-db-fra.com

tableView reloadData ne fonctionne pas

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
20
iCode

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 UITableViews 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.

14
Alfie Hanssen

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];
    });
}
9
user3730468

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:

tableView référence prise

2
ashish mankar

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.

0
Menno

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.

0
Max Friedman

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]
0
Hussain Shabbir