使用UITableViewCell使UIViews出列

时间:2012-05-01 06:52:02

标签: iphone objective-c uiview uitableview

在使用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 个答案:

答案 0 :(得分: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; 
} 

注意标签仅在单元格为零时创建。否则,使用标签找到它。

答案 1 :(得分: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.
}

答案 2 :(得分:0)

  

我需要一些能够以与细胞相同的方式重新使用我的标签的代码   正在被重用。

不,您需要更好地了解表格视图设计。很明显为什么多次添加视图 - 重用一个单元意味着你需要一个不再需要的UITableViewCell的前一个实例(从而节省了昂贵的新对象分配)并重用了这个实例。新细胞。但是之前的实例已经附加了标签,因此标签数量会增加。

我会继承UITableViewCell并将标签创建放在这个新类的初始化代码中。 (或者创建一个UIView子类并将其设置为单元格contentView,如此nice table tutorial by Matt Gallagher中所示。)这是封装视图详细信息并将其隐藏在表数据源中的正确方法

答案 3 :(得分: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];
}

您唯一需要注意的是重置视图中显示的内容,例如图片视图中的标签和图片中的文字。如果您没有旧的内容可能会与循环使用的表格单元一起重复使用。

祝你好运!