Le problème est que lorsque j'essaie de supprimer toutes les entrées de mon objet de source de données et d'effacer toutes les lignes de ma vue de table, je réussis la première partie, le compteur de lignes pour afficher (méthode tableView:numberOfRowsInSection:
) renvoie 0
, mais les cellules contiennent toujours des données obsolètes.Actualiser TableView après avoir effacé l'objet de source de données
(ont peu réputation ici pour publier des images, donc je l'ai téléchargé à ftp: history.png)
Voici un exemple de ce que je suis en train de faire. L'icône de la corbeille efface la base de données, définit les lignes comme étant nulles, mais ces cellules restent dans la table, ce qui provoque des plantages lors du défilement.
L'objet de source de données est stocké en tant que propriété dans AppDelegate, de sorte que ViewController récupère des données à partir de cet objet.
Voici quelques code:
HistoryViewController.h
@interface HistoryViewController : UITableViewController <UITableViewDataSource> {
IBOutlet UITableView *historyTable;
SynonymsAppDelegate *appDelegate;
}
@property (retain) UITableView *historyTable;
- (IBAction)clearHistory:(id) sender;
@end
HistoryViewController.m
@implementation HistoryViewController
@synthesize historyTable;
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
appDelegate = (SynonymsAppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate initHistoryList];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [appDelegate.historyList 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] autorelease];
}
HistoryModel *historyEntry = [appDelegate.historyList objectAtIndex:indexPath.row];
cell.textLabel.text = historyEntry.word;
return cell;
}
- (IBAction)clearHistory:(id)sender {
[HistoryDataController clearHistory]; // removes entries from DB
[appDelegate initHistoryList]; // refreshes data source object
[self.tableView reloadData]; // doesn't help
}
AppDelegate a (NSMutableArray) *historyList
propriété et cette fonction:
- (void)initHistoryList {
HistoryDataController *historyDataController = [[HistoryDataController alloc] initWithHistoryData];
historyList = [historyDataController.historyEntries retain];
[historyDataController release];
}
Je crois que le problème est que TableView met en cache en quelque sorte les valeurs de c'est des cellules, mais pourquoi affichage ne leur quand t ableView:numberOfRowsInSection:
retours 0
? Et comment purger ce cache?
Merci pour votre aide.
Avez-vous essayé de définir un point d'arrêt et de voir si le numberofrows de la section est réellement appelé? –
Oui, pas en définissant un point d'arrêt, cependant, j'ai enregistré les appels avec NSLog(); Lorsque vous appuyez sur le bouton de la corbeille, 1.database efface, 2.aussi bien que la propriété AppLelegate historyList, 3.rowsInSection renvoie 0, puis rien ne se passe (les cellules restent où elles sont) – nikans