我有一个customCell,我需要在每个单元格中添加多个UILabel作为“标记”, 我的代码是这样的:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *ID = @"topicCell";
MSPTopicCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
NSArray *labelArray = [TopicLabelArr objectAt:index.row];
for (int i = 0; i < [labelArray count]; i++) {
UILabel *tmpLabel = [UILabel alloc]initwithFrame .....];
tmpLabel.text = [labelArray objectAt:i];
[cell.view addSubview:tmpLabel];
}
return cell;
}
我使用Xib创建自定义单元格。 我需要的是使for循环仅在每个单元格上执行一次。 但是,tableView中有很多行,当我向上和向下滚动时,每次都会重复创建标签。怎么改进呢?任何的想法?感谢。
答案 0 :(得分:4)
当您使用dequeueReusableCellWithIdentifier
时,您没有创建新的MSPTopicCell
您(正如方法名称所示)重用一个单元格。
这是什么意思?你显然需要至少与你同时显示的数量一样多的单元格,但是一旦你开始滚动,滚动视图消失的单元格就会重复使用。
您添加到子视图的标签会超时添加,即使是已经添加了一些子视图的重复使用的单元格也会产生问题。
有很多方法可以解决它,这里有一些例子:
您可以删除添加新视图之前添加的子视图。使用以下代码在for循环之前添加以下行:
view.subviews.forEach({ $0.removeFromSuperview() }
为标签使用自定义标签,以便您可以看到它们已经存在或不存在:
for (int i = 0; i < [labelArray count]; i++) {
UILabel *tmpLabel = (UILabel *)[self viewWithTag:100+i];
if (tmpLabel == nil)
{
tmpLabel = [UILabel alloc]initwithFrame .....];
tmpLabel.tag = 100 + i;
[cell.view addSubview:tmpLabel];
}
tmpLabel.text = [labelArray objectAt:i];
}
我认为最好的解决方案,因为您已经使用了UITableViewCell
子类:只需在UILabel
类上直接添加一些MSPTopicCell
属性,这样就不会必须在cellForRowAtIndexPath
中创建它。但也许这种情况不适合你,因为标签的数量取决于labelArray
,它取决于细胞的位置。
答案 1 :(得分:0)
您可以创建一个UIView
,其中包含您的所有UILabel
。但是,当您重新使用时,只需从superview中删除该视图。
因此,您的单元格中的masterview将被删除。
即
[[cell.contentView viewWithTag:101] removeFromSuperview]
UIView *yourViewName = [[UIView alloc]init];
// set your view's frame based on cell.
yourViewName.tag = 101;
for (int i = 0; i < [labelArray count]; i++) {
UILabel tmpLabel = (UILabel )[self viewWithTag:100+i];
if (tmpLabel == nil)
{
tmpLabel = [UILabel alloc]initwithFrame .....];
tmpLabel.tag = 100 + i;
[yourViewName addSubview:tmpLabel];
}
tmpLabel.text = [labelArray objectAt:i];
}
[cell.contentView addSubView:yourViewName];
此过程也会加快单元格的滚动性能。
希望这个答案对你有所帮助。