2010-11-21 4 views
3

Проблема в том, что когда я пытаюсь удалить все записи в объекте источника данных и поэтому очистить все строки в моем представлении таблицы, я преуспею в первой части, счетчик строк чтобы показать (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? И как очистить этот кеш?

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

+0

Вы пробовали установить точку останова и посмотреть, действительно ли вызывается номер в разделе? –

+0

yep, не устанавливая точку останова, тем не менее, я регистрировал вызовы с помощью NSLog(); Когда вы нажимаете кнопку trashbin, 1.database очищается, 2.as хорошо, как свойство appLelegate historyList, 3.rowsInSection возвращает 0, а затем ничего не происходит (ячейки остаются там, где они есть) – nikans

ответ

0

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

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

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

0

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

+0

все выглядит хорошо здесь. «historyTable» класса HistoryViewController связан с UITableView .. – nikans

1

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

Так что [self.historyTable reloadData]; должен сделать трюк.

+0

Нет, я уже пробовал это. Кроме того, при использовании [self.tableView reloadData]; он вызывает по крайней мере tableView: numberOfRowsInSection: метод, и когда я пытаюсь [self.historyTable reloadData]; Это не. Тем не менее, возможно, это какое-то кэширование ячеек таблицы вызывает проблему? – nikans

+0

Если у вас нет двух видов таблиц в вашем представлении, я бы рекомендовал удалить historyTable, а затем сделать все подключения к tableView. Насколько я знаю, нет кеша, подобного тому, над которым вы наклоняетесь. Когда вы возвращаете 0 из numberOfRowsInSection, таблица очищается. Идея может заключаться в том, чтобы запустить новый проект с помощью шаблона навигации или добавить новый контроллер табличного представления и добавить функциональность по одной функции за раз. Я нашел некоторые проблемы. –

+0

Прошу прощения, я не понял. historyTable - свойство (IBOutlet) HistoryViewController (подкласс UITableViewController). Что такое tableView, к которому я должен подключаться?) Тем не менее, я постараюсь создать эту таблицу с нуля, постепенно добавляя функциональность. – nikans

1

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

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

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

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

Смежные вопросы