问题是当我试图删除我的数据源对象中的所有条目并清除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:
时会显示它们?以及如何清除缓存?
感谢您的帮助。
答案 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];
}
感谢大家的帮助。