当我打电话给[table reloaddata];
使用新数据重新绘制单元格,但是我的UILabel因为它们被旧UILabel绘制而搞砸了,所以它很乱。
static NSString* PlaceholderCellIdentifier = @"PlaceholderCell";
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:PlaceholderCellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:PlaceholderCellIdentifier] autorelease];
cell.detailTextLabel.textAlignment = UITextAlignmentCenter;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.contentView.backgroundColor = [UIColor clearColor];
}
是我的细胞初始。
我像这样添加UILabel
UILabel *theDateLabel = [[UILabel alloc] initWithFrame:CGRectMake(140, 35,140, 20)];
[theDateLabel setBackgroundColor:[UIColor clearColor]];
[theDateLabel setTextColor:[UIColor lightGrayColor]];
[theDateLabel setText:[dateFormatter stringFromDate:theDate]];
[theDateLabel setFont:[UIFont fontWithName:@"TrebuchetMS-Bold" size:15]];
[cell addSubview:theDateLabel];
[theDateLabel release];
细胞中还有一些标签,同样的东西。
我希望发生的是旧标签从单元格中消失,以便它们不再可见。
答案 0 :(得分:10)
您不应将theDateLabel
添加为cell
的子视图。您应该将其添加为cell.contentView
的子视图。
正如yuji建议的那样,实现这一点的一种方法是创建一个UITableViewCell
的子类,其中包含每个自定义子视图的属性。这样,您可以轻松访问重用单元格的日期标签,为新行设置文本。
另一种常见方法是使用每个tag
具有的UIView
属性。例如:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString* PlaceholderCellIdentifier = @"PlaceholderCell";
static const int DateLabelTag = 1;
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:PlaceholderCellIdentifier];
if (!cell) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:PlaceholderCellIdentifier] autorelease];
UILabel *theDateLabel = [[UILabel alloc] initWithFrame:CGRectMake(140, 35,140, 20)];
theDateLabel.tag = DateLabelTag;
theDateLabel.backgroundColor = [UIColor clearColor];
theDateLabel.textColor = [UIColor lightGrayColor];
theDateLabel.font = [UIFont fontWithName:@"TrebuchetMS-Bold" size:15];
[cell.contentView addSubview:theDateLabel];
[theDateLabel release];
}
NSDate *theDate = [self dateForRowAtIndexPath:indexPath];
UILabel *theDateLabel = [cell.contentView viewWithTag:DateLabelTag];
theDateLabel.text = [dateFormatter stringFromDate:theDate];
return cell;
}
答案 1 :(得分:5)
虽然Richard的解决方案可行,但如果您的单元格有任何其他子视图,它们也会被删除。此外,每次绘制单元格时分配和初始化子视图都不一定是最佳的。
此处的标准解决方案是创建一个UITableViewCell
的子类,其属性为@dateLabel
(对于其他标签,依此类推)。然后,当你初始化一个单元格时,如果它没有@dateLabel
但你可以给它一个新的单元格,否则你只需要设置它的文本。