0

我有一个 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;

}

谢谢。

4

4 回答 4

1

重新加载整个部分。我遇到了同样的问题。这段代码对我来说非常有效,而且只有一行。

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];

//don't forget to end refresh with 
[refreshControl endRefreshing];

与多行相反。

为什么它有效?它重新加载整个部分,因此无论您在一个部分中有多少单元格,这都会重新加载它们,而不是尝试使用计数或其他东西来做一个语句。

于 2014-10-20T08:01:53.227 回答
0

您是否尝试过重新加载受影响的行?

[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
于 2013-10-04T14:12:31.717 回答
0

您必须在 viewWillAppear 中重新加载 tableview。

-(void)viewWillAppear:(BOOL)animated{
    [self.tableView reloadData];
}
于 2013-10-04T14:07:13.107 回答
0

这很可能是因为细胞的重复使用。当您重复使用一个单元格时,它不是一个新单元格(这就是为什么它如此之快,您不会破坏和重新创建一个单元格)。

因此,您唯一需要做elseif (!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];
        }
    }
}
于 2013-10-04T14:36:58.823 回答