现在已经有这个问题几天了,似乎无法找到解决方案。这可能是一些非常基本的东西,但仍然无法提出解决方案。
我有一堆标签嵌套在表格视图单元格中,并带有一个编辑导航控制器按钮,可以转到另一个表视图。 此表视图具有将数据存储到SQLite数据库的文本字段。标签从数据库返回某些值。现在这部分完美无缺。 但是,当我更新文本字段并导航回标签时,标签不会更新,如果我滚动表格以使修改后的单元格不在视图中,那么它会更新,所以认为问题是单元格仍然具有旧值缓存,只有在它出列时才释放它。
部分代码:(至少我认为这是重要的,因为这是创建单元格的地方)
欢迎任何帮助。 感谢
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"ContactsDetailCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// Configure the cell.
int row = [indexPath row]; int section = [indexPath section];
NSDictionary * resultSet = [sqliteManager queryRow:[NSString stringWithFormat:@“SELECT * FROM contacts WHERE id =%d;”,contactsId]];
switch(section){ 案例0: 开关(行){ 案例0: cell.textLabel.text = @“名称:”;
UILabel *nameLabel = [[UILabel alloc] initWithFrame: CGRectMake(90, 10, 200, 25)];
nameLabel.text = [resultSet objectForKey:@"name"];
nameLabel.textColor = [UIColor blackColor];
nameLabel.font = [UIFont systemFontOfSize:17.0];
nameLabel.backgroundColor = [UIColor whiteColor];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
[cell.contentView addSubview:nameLabel];
[nameLabel release];
break;
case 1:
cell.textLabel.text = @"Address:";
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UILabel *addressLabel = [[UILabel alloc] initWithFrame: CGRectMake(90, 10, 200, 25)];
addressLabel.text = [resultSet objectForKey:@"address"];
addressLabel.textColor = [UIColor blackColor];
addressLabel.font = [UIFont systemFontOfSize:17.0];
addressLabel.backgroundColor = [UIColor whiteColor];
[cell.contentView addSubview:addressLabel];
[addressLabel release];
break;
default:
break;
} 打破; 默认: 打破;
答案 0 :(得分:7)
每当您对基础数据源进行更改时,都需要手动更新表视图。 UITableView的reloadData
方法是快速而低效的方法。正确的方法是:
NSArray *cells = [myTableView visibleCells];
NSMutableArray *indexPaths = [[NSMutableArray alloc] init];
for (UITableViewCell *cell in cells) {
[indexPaths addObject:[myTableView indexPathForCell:cell]];
}
[myTableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:NO];
[indexPaths release];
您可以在控制器的viewWillAppear
方法中执行此操作。
答案 1 :(得分:1)
您必须告诉视图更新数据并在完成更改后再次绑定到UITableView。您可以在向后导航时调用的viewWillAppear方法中执行此操作。
答案 2 :(得分:1)
您可以尝试在主表的实现文件中添加此代码:
-(void)viewWillAppear:(BOOL)animated {
[self.tableView reloadData];
[super viewWillAppear:animated];
}
在某些情况下,这不起作用,我解决了使用类和没有nib以编程方式创建单元格;)
希望这可以帮到你!