2011-08-26 6 views
3

J'ai un ivar de UITableView * myTableView. J'ai des données chargées depuis internet donc quand les données sont chargées dois-je appeler [myTableView setNeedsDisplay], je sais que je peux/devrait appeler [myTableView reloadData] mais la confusion est que l'appel à setNeedsDisplay devrait aussi fonctionner mais ne fonctionne pas.Confusion à propos de setNeedsDisplay de UIView

Je cherche juste une explication de ce que fait setNeedsDisplay? lorsqu'il est appelé sur l'instance UITableView.

Selon la documentation setNeedsDisplay appelle drawRect dans le "cycle de dessin suivant". donc peut-on me dire quel est le prochain cycle de dessin.

Répondre

5

setNeedsDisplay marque l'appelant UIView comme ayant besoin d'être redessiné est un sens purement visuel, qui comme indiqué se produira sur le cycle de dessin suivant.

Ceci est complètement différent de recharger les données lorsqu'il est utilisé dans un contexte UITableView. Pour plus d'informations sur le sujet, voir this article.

6

setNeedsDisplay méthode n'a rien à voir avec le rechargement du tableView. Il ne fait que redessiner le view du tableauView, pas ses cellules ou séparateurs.

setNeedsDisplay et reloadData sont entièrement à des fins différentes.

1

En règle générale, vous n'avez qu'à appeler setNeedsDisplay sur les vues personnalisées pour lesquelles vous avez implémenté drawRect.

1

setNeedsDisplay

Un bon exemple de ceci est quand un UIImageView est rendu avec une image; et pendant qu'il est encore à l'écran, vous changez l'image en quelque chose d'autre. Dans ce cas, le simple fait de changer l'image ne déclenche pas toujours le repeindre de la vue. Pour cela, vous devez appeler setNeedsDisplay.

reloadData

Il doit être appelé lorsque la sous-jacente source de données pour le tableview est changé et que vous voulez que pour être refelected dans UI.In cet appel de cas cette reloadData mehod

0

Mon la solution consistait à mettre à jour toutes les cellules visibles et à garder trace de l'indexPath de la cellule dans ma classe personnalisée "ProductTableViewCell" avec reloadRowsAtIndexPaths, voir ci-dessous:

NSArray *arrayCells = [self.tableView visibleCells]; 
NSMutableArray *mArrayIndexPaths = [[NSMutableArray alloc] init]; 
for(ProductTableViewCell *cell in arrayCells) { 
    [mArrayIndexPaths addObject:cell.indexPath]; 
} 

[self.tableView beginUpdates]; 
[self.tableView endUpdates]; 
[self.tableView reloadRowsAtIndexPaths:[mArrayIndexPaths copy] withRowAnimation:UITableViewRowAnimationAutomatic]; 

Voici comment la classe est définie:

@interface ProductTableViewCell : UITableViewCell { 
    NSString *reuseID; 
} 

@property (nonatomic, strong) NSIndexPath *indexPath; 
Questions connexes