189 votes

Est-il possible de rafraîchir un seul UITableViewCell dans un UITableView?

J'ai un custom UITableView utilisant UITableViewCell s. Chaque UITableViewCell contient 2 boutons. En cliquant sur ces boutons, vous modifierez une image en UIImageView dans la cellule. Est-il possible de rafraîchir chaque cellule séparément pour afficher la nouvelle image? Toute aide est appréciée.

Merci d'avance.

330voto

Romain Points 1749

Une fois que vous avez l'indexPath de votre cellule, vous pouvez faire quelque chose comme:

 [self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPathOfYourCell, nil] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; 
 

Dans Xcode 4.6 et supérieur:

 [self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[indexPathOfYourCell] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; 
 

Vous pouvez bien sûr définir ce que vous voulez comme effet d'animation.

34voto

MattDiPasquale Points 23842

J'ai essayé d'appeler simplement -[UITableView cellForRowAtIndexPath:] , mais cela n'a pas fonctionné. Mais, ce qui suit fonctionne pour moi par exemple. I alloc et release the NSArray pour une gestion serrée de la mémoire.

 - (void)reloadRow0Section0 {
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil];
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
    [indexPaths release];
}
 

16voto

The-Rooster Points 77

Si vous êtes à l'aide personnalisée TableViewCells, le générique

[self.tableView reloadData];    

n'est pas efficace pour répondre à cette question , sauf si vous quittez le point de vue actuel et de revenir. Ni la première réponse.

Pour réussir à recharger votre premier tableau de l'affichage de la cellule sans changer de vue, utilisez le code suivant:

//For iOS 5 and later
- (void)reloadTopCell {
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil];
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
}

Insérez la suite de l'actualisation de la méthode qui appelle à la méthode ci-dessus de sorte que vous pouvez recharger seulement le haut de la cellule (ou de l'ensemble de la vue de la table si vous le souhaitez):

- (void)refresh:(UIRefreshControl *)refreshControl {
    //call to the method which will perform the function
    [self reloadTopCell];

    //finish refreshing 
    [refreshControl endRefreshing];
}

Maintenant que vous avez triés, à l'intérieur de votre viewDidLoad ajouter les éléments suivants:

//refresh table view
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];

[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];

[self.tableView addSubview:refreshControl];

Vous avez maintenant un rafraîchissement personnalisé de la table, qui va recharger la cellule d'en haut. Pour recharger la totalité de la table, ajouter le

[auto.tableView reloadData]; à votre nouvelle méthode d'actualisation.

Si vous souhaitez recharger les données chaque fois que vous changer de vue, de mettre en œuvre la méthode:

//ensure that it reloads the table view data when switching to this view
- (void) viewWillAppear:(BOOL)animated{

    [self.tableView reloadData];
}

3voto

Gregory Hill Points 51

Juste pour mettre à jour ces réponses légèrement avec la nouvelle syntaxe littérale dans iOS 6-vous pouvez utiliser des Chemins d'accès = @[indexPath] pour un objet unique, ou des Chemins d'accès = @[indexPath1, indexPath2,...] pour plusieurs objets.

Personnellement, j'ai trouvé la syntaxe littérale pour les tableaux et les dictionnaires pour être extrêmement utile, et de gagner beaucoup de temps. C'est juste plus facile à lire, pour une chose. Et il élimine le besoin d'un nul à la fin d'un multi-objet de la liste, qui a toujours été un personnel bugaboo. Nous avons tous nos moulins à vent pour l'inclinaison, oui? ;-)

Juste pensé que je jetterais cette dans le mélange. Espérons que cela aide.

-1voto

Pavan Kotesh Points 50

Au lieu d'utiliser beginUpdates et endUpdates, vous pouvez simplement utiliser

 [_tableview reloadData]
 

Avant de l'utiliser, vous devez utiliser l'identifiant de synthèse dans votre fichier .m

 @synthesize tableview = _tableview; 
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X