清除数据源对象后刷新TableView

时间:2010-11-21 18:33:01

标签: iphone objective-c caching uitableview

问题是当我试图删除我的数据源对象中的所有条目并清除tableview中的所有行时,我正在成功完成第一部分,显示行的计数器({{1} } method)返回tableView:numberOfRowsInSection:,但单元格仍然包含过时的数据。

(在这里发布图片名声不大,所以我将其下载到ftp:history.png

这是我正在尝试做的一个例子。垃圾箱图标清除数据库,将行数设置为零,但这些单元格保留在表格中,滚动时会导致崩溃。

数据源对象作为AppDelegate中的属性存储,因此ViewController从那里获取数据。

以下是一些代码:

HistoryViewController.h

0

HistoryViewController.m

@interface HistoryViewController : UITableViewController <UITableViewDataSource> {
    IBOutlet UITableView *historyTable;
    SynonymsAppDelegate *appDelegate;
}

@property (retain) UITableView *historyTable;

- (IBAction)clearHistory:(id) sender;

@end

AppDelegate 具有@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 } 属性和此功能:

(NSMutableArray) *historyList

我认为问题是TableView以某种方式缓存了它的单元格的值,但为什么在t - (void)initHistoryList { HistoryDataController *historyDataController = [[HistoryDataController alloc] initWithHistoryData]; historyList = [historyDataController.historyEntries retain]; [historyDataController release]; } 返回ableView:numberOfRowsInSection:时会显示它们?以及如何清除缓存?

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

我认为你的问题是行[self.tableView reloadData];你要清除的是UITableViewController的tableView,而不是我猜你正在使用的historyTable。

所以[self.historyTable reloadData];可以做到这一点。

答案 1 :(得分:1)

如果没有关于您的设置的更多信息,我无法确定,但这是我认为正在发生的事情。

您的视图中有两个表格。如果Nib没有给出一个表,UITableViewController会自动创建自己的表。通过在Interface Builder中使用tableView属性并删除historyTable属性来解决此问题。

未正确设置表上的dataSource属性。确保将其设置为HistoryViewController对象,否则它将不知道从何处获取数据。

此外,您的initHistoryList方法中存在内存泄漏。旧的historyList值未释放,因此将被泄露。但为什么你必须同时调用[HistoryDataController clearHistory]和[appDelegate initHistoryList]?不应该清除数据库清除数组吗?如果没有,您应该能够在initHistoryList中创建一个新的NSMutableArray,而不是创建和释放HistoryDataController。

答案 2 :(得分:0)

检查您的UITableView IBOutlet。如果连接不正确,您对reloadData的呼叫将无效。

答案 3 :(得分:0)

因此,问题的定义是对TableView委托和出口的误解。 例如,- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section应替换为- (NSInteger)tableView:historyTable [...],从而可以创建TableView实例,并允许我们在reloadData方法中为- (IBAction)clearHistory:(id)sender调用正确的TableView实例:< / p>

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

感谢大家的帮助。