关于刷新自定义表格单元格有很多问题,但这个问题很奇怪。我有一个tableView,每个单元格现在都有自定义UILabel
和UIImageView
。
目前只有2个细胞。第一个显示日期。当表首次加载时,它会在第一个单元格UILabel
中将当前日期显示为字符串。
当我选择第一个单元格时,我会出现一个处理所有日期选择的自定义类。选择日期后,会弹出此视图,然后返回到表格视图。
在-(void)viewDidAppear
上,重新加载了tableviews数据,并显示新的选定日期。
但是,第一个单元格中的标签未更新。
令人困惑的是,如果我有多个单元格都显示相同的数据,这些将全部刷新并按预期显示新日期。似乎索引:0处的单元格行不会刷新。
进一步混淆的是当我查询单元格的UILabel
的字符串值时,它返回正确的日期。
- (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];
//
// clears the grouped style border from each table cell
//
UIView *clearBgView = [[UIView alloc]initWithFrame:CGRectZero];
[cell setBackgroundView:clearBgView];
// label
UILabel *dl = [[UILabel alloc]initWithFrame:CGRectMake(70.0f, 10.0f, screenWidth-100, 50)];
[self setDetailsLabel:dl];
dl = nil;
[[self detailsLabel] setBackgroundColor:[UIColor colorWithRed:.1 green:.1 blue:.1 alpha:.1 ]];
[[self detailsLabel] setTextColor:[UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:.3f]];
//icon for each cell
UIImageView *ci = [[UIImageView alloc]initWithFrame:CGRectMake(10.0f, 10.0f, 50.0f, 50.0f)];
[ci setBackgroundColor:[UIColor colorWithRed:.2 green:.2 blue:.2 alpha:.2]];
[self setCellIcon:ci];
ci = nil;
//
// set up views
//
[cell addSubview:[self cellIcon]];
[cell addSubview:[self detailsLabel]];
}
// Configure the cell...
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
//populate each by row.
NSString *dateDisplay = [self formatDate:[self dateCaught]];
NSLog (@"date is %@", dateDisplay);
[[self detailsLabel] setText:[self formatDate:[self dateCaught]]];
switch (indexPath.row) { //this needs to be an integer, so return the row of the indexPath.
case 0:
NSLog (@"text for the cell is %@",[[self detailsLabel]text]);
break;
default:
break;
}
return cell;
}
答案 0 :(得分:4)
问题与你传递detailsLabel
的方式有关。您将其保存在self
[self setDetailsLabel:dl];
但只有当单元格不可供重复使用时才设置它。当您重复使用单元格时,detailsLabel
上的self
将设置为先前运行的标签,从而导致各种问题。
最干净的解决方案是创建自己的派生自UITableViewCell
的类,将创建标签,图标,背景颜色等的初始化代码移动到指定的初始值设定项中,并创建用于设置标签文本的属性。有了这个类,您就可以按如下方式简化代码:
UIMyCustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UIMyCustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
[[cell detailsLabel] setText:[self formatDate:[self dateCaught]]];
// ^--- detailsLabel can be moved to UIMyCustomTableViewCell now
答案 1 :(得分:0)
解决方案是,不使用@property detailsLabel
之类的成员变量,而是使用所有自定义子视图的标记。像这样更改你的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
[...]
// label
UILabel *dl = [[UILabel alloc]initWithFrame:...];
dl.tag = 99;
[cell.contentView addSubview: dl];
[...]
}
[...]
UILabel *dl = [cell.contentView viewWithTag: 99];
[dl setText:[self formatDate:[self dateCaught]]];
[...]
return cell;
}