Проблема в том, что когда я пытаюсь удалить все записи в объекте источника данных и поэтому очистить все строки в моем представлении таблицы, я преуспею в первой части, счетчик строк чтобы показать (tableView:numberOfRowsInSection:
метод) возвращает 0
, но ячейки все еще содержат устаревшие данные.Обновить TableView после очистки объекта источника данных
(Имейте немного репутацию здесь, чтобы получить возможность отправлять изображения, поэтому я скачал его FTP: history.png)
Вот пример того, что я пытаюсь сделать. Значок корзины удаляет базу данных, устанавливает количество строк до нуля, но эти ячейки остаются в таблице, что приводит к сбоям при прокрутке.
Объект источника данных хранится как свойство в AppDelegate, поэтому ViewController получает данные оттуда.
Вот код:
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 имеет (NSMutableArray) *historyList
свойство и эту функцию:
- (void)initHistoryList {
HistoryDataController *historyDataController = [[HistoryDataController alloc] initWithHistoryData];
historyList = [historyDataController.historyEntries retain];
[historyDataController release];
}
Я считаю, что проблема заключается в том, что каким-то образом TableView кэширует значения это клетки, но почему они отображаются при т ableView:numberOfRowsInSection:
возвращается 0
? И как очистить этот кеш?
Спасибо за помощь.
Вы пробовали установить точку останова и посмотреть, действительно ли вызывается номер в разделе? –
yep, не устанавливая точку останова, тем не менее, я регистрировал вызовы с помощью NSLog(); Когда вы нажимаете кнопку trashbin, 1.database очищается, 2.as хорошо, как свойство appLelegate historyList, 3.rowsInSection возвращает 0, а затем ничего не происходит (ячейки остаются там, где они есть) – nikans