刷新自定义tableView中的单元格

时间:2013-10-04 14:01:32

标签: iphone ios objective-c uitableview

我有一个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 个答案:

答案 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}}