aktualisieren TableView nach dem löschen des data-source-Objekt
Das Problem ist, wenn ich versuche zu löschen, alle Einträge in meinem data-source-Objekt und so deaktivieren Sie alle Zeilen, die in meinem tableview, ich bin erfolgreich mit dem ersten Teil, wird der Zähler der Zeilen anzeigen (tableView:numberOfRowsInSection:
- Methode) zurück 0
, aber die Zellen noch enthalten veraltete Daten.
(Wenig Ruf hier zu posten Bilder, also ich habe es runtergeladen, auf ftp: Geschichte.png)
Hier ist ein Beispiel von, was ich versuche zu tun. Das Papierkorb-Symbol löscht die Datenbank, setzt den Zeilen-Zählung auf null, aber diese Zellen bleiben in der Tabelle, die Abstürze beim scrollen es.
Data-source-Objekt speichert als eine Eigenschaft im AppDelegate, so ViewController bekommt die Daten von dort.
Hier einige 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 hat (NSMutableArray) *historyList
Eigenschaft und diese Funktion:
- (void)initHistoryList {
HistoryDataController *historyDataController = [[HistoryDataController alloc] initWithHistoryData];
historyList = [historyDataController.historyEntries retain];
[historyDataController release];
}
Ich glaube das problem ist, dass TableView irgendwie speichert die Werte der Zellen, aber warum tun Sie das display, wenn tableView:numberOfRowsInSection:
zurück 0
? Und wie zu reinigen, dass die cache -?
Danke für die Hilfe.
- Haben Sie versucht, setzen von Breakpoints und sehen, wenn die numberofrows in diesem Abschnitt ist eigentlich aufgerufen?
- ja, nicht durch das setzen eines Breakpoints, obwohl, ich habe die Protokollierung der Anrufe mit NSLog(); Beim Antippen der trashbin-Taste, 1.Datenbank löscht, 2.sowie AppDelegate historyList Eigentum, 3.rowsInSection 0 zurück, und dann passiert nichts (Zellen bleiben, wo Sie sind)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke dein problem ist die Zeile
[self.tableView reloadData];
Was Sie sind clearing ist der tableView des UITableViewController und nicht die historyTable ich bin zu raten, die Sie verwenden.So ein
[self.historyTable reloadData];
sollte den trick tun.Ohne mehr Informationen über dein setup, ich kann nicht sicher sein, aber das ist, was ich denke, geschieht.
Gibt es zwei Tabellen in Ihrem Blick. UITableViewController erstellt automatisch eine eigene Tabelle, wenn es nicht gegeben ist, eine durch die Feder. Dieses Problem beheben, indem Sie mithilfe der tableView-Eigenschaft im Interface Builder, und entfernen Sie die historyTable Eigenschaft.
Die dataSource-Eigenschaft auf die Tabelle ist nicht richtig eingestellt. Stellen Sie sicher, es ist die HistoryViewController Objekt, oder er wird nicht wissen, wo die Daten aus.
Außerdem haben Sie einen Speicherverlust in Ihrer initHistoryList Methode. Die alten historyList Wert ist nicht veröffentlicht, so wird es durchgesickert sein. Aber warum haben Sie zu rufen beide [HistoryDataController clearHistory] und [appDelegate initHistoryList]? Sollte das nicht löschen der Datenbank deaktivieren Sie das array zu? Wenn nicht, sollten Sie in der Lage, erstellen Sie einfach ein neues NSMutableArray in initHistoryList anstelle der Schaffung und Freigabe einer HistoryDataController.
Überprüfen Sie Ihre
UITableView
IBOutlet. Wenn es falsch angeschlossen ist, wird Ihr Anruf zureloadData
würde nichts tun.Also ist das problem definitiv war in Missverständnis der TableView delegate und outlets.
Zum Beispiel
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
sollte ersetzt werden, mit- (NSInteger)tableView:historyTable [...]
so awoiding Erzeugung von TableView-Instanz und es ermöglicht uns, rufen SiereloadData
für eine ordnungsgemäße TableView Instanz in unserem- (IBAction)clearHistory:(id)sender
Methode:Danke an alle für Eure Hilfe.