2

在使用 UITableView 的正常情况下,我有重用旧单元格的标准代码:

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";
    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    return cell;
}

然而,我注意到,当我将子视图添加到单元格时,它们并没有被删除,并且每次都添加了一个新视图。我在下面有一个例子可以完美地展示它:

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";

    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

    UILabel *label = [[UILabel alloc] init];
    label.text = @"HELLO";
    label.frame = CGRectMake(arc4random() % 50, -1, 286, 45);
    label.backgroundColor = [UIColor clearColor];

    // Add views
    [cell addSubview:label];

    return cell;
}

我需要一些代码,以与重用单元格相同的方式再次重用我的标签。我该怎么办?

谢谢

4

4 回答 4

4

如果您正在创建一个新单元格,则只能添加子视图。如果您正在出队,则子视图已经存在,不应重新创建。

你的方法应该是:

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:cellIdentifier]; 
    UILabel *label;
    if (cell == nil) 
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
        label = [[UILabel alloc] init];
        label.tag = 1;
        // Add views 
        [cell addSubview:label];
    }
    else
    {
        // Label will already exist, get a pointer to it
        label = [cell viewWithTag:1];
    }

    // Now set properties on the subview that are unique to each cell
    label.text = @"HELLO"; 
    label.frame = CGRectMake(arc4random() % 50, -1, 286, 45); 
    label.backgroundColor = [UIColor clearColor]; 

    return cell; 
} 

请注意标签是如何仅在单元格为 nil 时创建的。否则,使用标签找到它。

于 2012-05-01T07:27:17.610 回答
0

else你可以使用类似的东西if(cell == nil)

for (UIView *sub in [cell.contentView subviews]) 
{
            if([UILabel class] == [sub class])
                NSLog(@"%@",[sub class]);
                UILabel *label = (UILabel *)sub;
                //do label coding ie set text etc.
}
于 2012-05-01T07:27:24.343 回答
0

我需要一些代码,以与重用单元格相同的方式再次重用我的标签。

不,您需要更好地了解表格视图设计。视图被多次添加的原因应该很明显——重用一个单元意味着您获取一个UITableViewCell不再需要的先前实例(从而节省了新对象的昂贵分配)并将这个实例重用于新单元。但是这个先前的实例已经附加了标签,所以标签的数量增加了。

我将子类UITableViewCell化并将标签创建放在这个新类的初始化代码中。(或者创建一个UIView子类并将其设置为单元格contentView,正如Matt Gallagher 在这个漂亮的表格教程中所建议的那样。)这是封装视图详细信息并将它们隐藏在表格数据源中的正确方法。

于 2012-05-01T07:35:54.870 回答
0

我在自定义表格单元类中使用视图的延迟初始化。它只需要加载视图和“addSubview”一次。

- (void) lazyInitTitleLabel {
    if (_titleLabel != nil) {
        return;
    }

    _titleLabel = [[UILabel alloc] initWithFrame: CGRectMake(10.0f, 10.0f, 200.0f, 30.0f)];
    // Cell adds the label as a subview...
    [self addSubview: _titleLabel];
}

您唯一需要注意的是重置视图显示的任何内容,例如标签中的文本和图像视图中的图像。如果您不这样做,旧内容可能会与回收的表格单元格一起重复使用。

祝你好运!

于 2012-05-01T08:16:17.617 回答