我有一个UITableView,它是从NSMutable数组中填充的,其中包含79个条目。当我运行我的应用程序并向下滚动表格时,一个单元格中似乎有多个条目。这似乎发生在屏幕高度和桌子下方的一半。
例如:
数组中的一个对象是@“Dog”,另一个是@“Cat”。在一个单元格中,您可以看到使用cellLabel文本写的Cat和Dog。
初始化单元格的代码
// Customize the appearance of table view cells.
- (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] autorelease];
cell.accessoryType = UITableViewCellAccessoryNone;
}
// Configure the cell...
UILabel *cellLabel = [[[UILabel alloc] initWithFrame:cell.frame] autorelease];
cellLabel.text = [symptomsArray objectAtIndex:indexPath.row];
cellLabel.textColor = [UIColor blackColor];
cellLabel.backgroundColor = [UIColor clearColor];
cellLabel.opaque = NO;
[cell.contentView addSubview:cellLabel];
cell.contentView.backgroundColor = [UIColor colorWithRed:(214.0/255) green:(215.0/255.0) blue:(217.0/255) alpha:1.0];
return cell;
}
答案 0 :(得分:1)
这是因为您每次都要添加标签 如果你真的需要那个新的UiLabel然后将它添加到你所拥有的if语句中并从if
中更改它的文本为了有效地做到这一点,你必须将UITableViewCell子类化为
希望这有帮助
答案 1 :(得分:1)
子视图相对于其超级视图的边界定位。因此,例如,如果您希望cellLabel
位于内容视图的左上角,则需要将其原点设置为(0,0)。您正在使用单元格的框架,该框架相对于表格视图的左上角。
当您向下滚动时,UITableView
正在重复使用旧单元格,并且您正在为这些单元格添加其他标签。这些单元格的框架的起源偏离表格视图顶部的一两个屏幕,因此您将新标签定位在单元格的实际边界之外。以下是修复方法。
static int CellLabelTag = 12345;
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.accessoryType = UITableViewCellAccessoryTypeNone;
UILabel *cellLabel = [[[UILabel alloc] initWithFrame:cell.contentView.bounds] autorelease];
cellLabel.tag = 585493;
[cell.contentView addSubview:CellLabelTag];
}
UILabel *cellLabel = (UILabel *)[cell viewWithTag:CellLabelTag];
cellLabel.text = // your text here
// blah blah blah configuration
return cell;
答案 2 :(得分:1)
保持简单。
如果您只有几个条目,为什么不在加载之前分配一个单元格数组,并直接从数组中加载单元格对象:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
return [arrayOfCells objectAtIndex:indexPath.row]; //already allocated one single time at the beginning
}
不再有dequeueReusableCellWithIdentifier ..
保持简单!
答案 3 :(得分:1)
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];
}
确保“dequeueReusableCellWithIdentifier”和“reuseIdentifier”应为“nil”
现在它会起作用!!
答案 4 :(得分:0)
亚力克答案是最好的答案,很多人都没有意识到这种情况正在发生,特别是如果他们没有使用ClearColor背景标签,在这种情况下你永远不会看到这种覆盖。
我首选的解决方案是使用您想要的属性创建自定义单元格。所以在这种情况下,你会创建
@interfacce MyCustomCell : UITableViewCell
@property (nonatomic) UILabel *cellLabel;
@end
给它一个属性UILabel * cellLabel,除了在MyCustomCell.m的init中设置标签文本之外,执行上面的所有代码,用self替换任何单元格实例,例如:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self)
{
self.cellLabel = [[UILabel alloc] initWithFrame:cell.frame];
self.cellLabel.textColor = [UIColor blackColor];
self.cellLabel.backgroundColor = [UIColor clearColor];
self.cellLabel.opaque = NO;
[self..contentView addSubview:cellLabel];
self.contentView.backgroundColor = [UIColor colorWithRed:(214.0/255) green:(215.0/255.0) blue:(217.0/255) alpha:1.0];
}
return self;
}
现在在你的cellForRowAtIndexPath中使用MyCustomCell,你检查cell == nil,你可能还要检查单元格标签:
if(cell == nil || cell.cellLabel == nil)
以完全相同的方式初始化它:
cell = [[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
现在,您需要做的就是设置:
cell.cellLabel.text = [symptomsArray objectAtIndex:indexPath.row];
你的cellForRowAtIndexPath中的代码更清晰,内存效率更高,并且你不会得到你的错误。
请记住在接口构建器中将您的单元格设置为MyCustomCell类型。