обновить TableView после очистки объекта источника данных - PullRequest
3 голосов
/ 21 ноября 2010

Проблема в том, что когда я пытаюсь удалить все записи в моем объекте источника данных и таким образом очистить все строки в моем табличном представлении, у меня получается с первой частью, счетчиком отображаемых строк (tableView:numberOfRowsInSection: метод) возвращает 0, но ячейки по-прежнему содержат устаревшие данные.

(имеют небольшую репутацию здесь, чтобы публиковать изображения, поэтому я загрузил его в 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 каким-то образом кэширует значения своих ячеек, но почему они отображаются, когда t ableView:numberOfRowsInSection: возвращает 0?А как очистить этот кеш?

Спасибо за помощь.

Ответы [ 4 ]

1 голос
/ 22 ноября 2010

Я думаю, что ваша проблема в строке [self.tableView reloadData]; То, что вы очищаете, - это tableView UITableViewController, а не historyTable, который, я полагаю, вы используете.

Так что [self.historyTable reloadData]; должен добиться цели.

1 голос
/ 28 ноября 2010

Без дополнительной информации о вашей настройке я не могу быть уверен, но это то, что я думаю, происходит.

На ваш взгляд, есть две таблицы. UITableViewController автоматически создает свою собственную таблицу, если она не предоставлена ​​нибером. Исправьте это с помощью свойства tableView в Interface Builder и удалите свойство historyTable.

Свойство dataSource в вашей таблице установлено неправильно. Убедитесь, что он установлен для вашего объекта HistoryViewController, иначе он не будет знать, откуда взять данные.

Также у вас есть утечка памяти в вашем методе initHistoryList. Старое значение historyList не освобождается, поэтому оно будет пропущено. Но почему вы должны вызывать [HistoryDataController clearHistory] и [appDelegate initHistoryList]? Разве очистка базы данных не должна очистить массив? Если нет, то вы можете просто создать новый NSMutableArray в initHistoryList вместо создания и освобождения HistoryDataController.

0 голосов
/ 11 февраля 2011

Таким образом, проблема заключалась в непонимании делегата и выходов TableView.Например, - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section следует заменить на - (NSInteger)tableView:historyTable [...], что предотвращает создание экземпляра TableView и позволяет нам вызывать reloadData для правильного экземпляра TableView в нашем методе - (IBAction)clearHistory:(id)sender:

- (IBAction)clearHistory:(id)sender {
    [HistoryDataController clearHistory];
    [appDelegate.historyList removeAllObjects];
    [appDelegate initHistoryList];
    [self.historyTable reloadData];
}

Спасибо всем за вашу помощь.

0 голосов
/ 21 ноября 2010

Проверьте свой UITableView IBOutlet. Если он неправильно подключен, ваш звонок на reloadData ничего не даст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...