我有一个tableView和一个detailView,用户可以在其中更改数据。它完美地工作,直到我以编程方式将单元格从字幕更改为自定义。现在,当我编辑数据并返回时,我看到新数据与旧数据重叠,尽管viewDidLoad中存在[self.tableView reloadData]。数据更改工作正常,因为如果重新启动应用程序,则会显示新数据
单元格之间的分隔线也没有覆盖整个宽度。
以下是自定义单元格的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UILabel *mainLabel, *detailLabel, *secondLabel;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (!cell)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
mainLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 5.0, 220.0, 15.0)];
// mainLabel.tag = MAINLABEL_TAG;
mainLabel.font = [UIFont systemFontOfSize:14.0];
mainLabel.textAlignment = NSTextAlignmentLeft;
mainLabel.textColor = [UIColor blackColor];
mainLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
[cell.contentView addSubview:mainLabel];
secondLabel = [[UILabel alloc] initWithFrame:CGRectMake(100.0, 5.0, 200, 15.0)];
// secondLabel.tag = MAINLABEL_TAG;
secondLabel.font = [UIFont systemFontOfSize:10.0];
secondLabel.textAlignment = NSTextAlignmentRight;
secondLabel.textColor = [UIColor whiteColor];
secondLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
[cell.contentView addSubview:secondLabel];
detailLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 20.0, 220.0, 25.0)];
// detailLabel.tag = SECONDLABEL_TAG;
detailLabel.font = [UIFont systemFontOfSize:12.0];
detailLabel.textAlignment = NSTextAlignmentLeft;
detailLabel.textColor = [UIColor lightGrayColor];
detailLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
[cell.contentView addSubview:detailLabel];
SNMGps *aCell = [arrayOfCell objectAtIndex:indexPath.row];
mainLabel.text = [NSString stringWithFormat:@"%@", aCell.name];
secondLabel.text = [NSString stringWithFormat:@"%d",aCell.gpsID];
detailLabel.text = [NSString stringWithFormat:@"%@",aCell.notes];
return cell;
}
感谢。
答案 0 :(得分:1)
重新加载整个部分。我遇到了同样的问题。这段代码对我来说非常合适,而且它只有一行。
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
//don't forget to end refresh with
[refreshControl endRefreshing];
与多行相对。
为什么会这样?它会重新加载整个部分,所以无论你在一个部分中有多少个单元格,这都会重新加载它们,而不是试图用一个计数或一些花哨的东西来做一个声明。
答案 1 :(得分:0)
您必须在viewWillAppear中重新加载tableview。
-(void)viewWillAppear:(BOOL)animated{
[self.tableView reloadData];
}
答案 2 :(得分:0)
您是否尝试过重新加载受影响的行?
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
答案 3 :(得分:0)
很可能是因为细胞的重复使用。当你重用一个单元格时,它不是一个新单元格(这就是为什么它如此之快,你不会破坏并重新创建一个单元格)。
因此,else
if (!cell)
if (!cell) {
...
}
else {
for (int i = cell.contentView.subviews.count -1; i>=0; i--) {
UIView * v = [cell.contentView.subviews objectAtIndex:i];
if ([v isKindOfClass:[UILabel class]]) {
[v removeFromSuperview];
}
}
}
中唯一需要删除单元格中的所有标签,事情就会好起来!
例如:
{{1}}