动态地将子视图添加到UITableViewCell

时间:2015-12-16 11:22:53

标签: ios objective-c uitableview

我正在尝试将一些子视图添加到我的UITableViewCell。子视图的数量基于我的数据。当我向下滚动子视图消失并且不再显示时。将它们添加到NIB是没有选择的,因为我现在只是运行时的子视图的数量,并且它们对于每个单元格是不同的。

在运行时向UITableViewCell添加未知数量的子视图的正确方法是什么?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"DetailCell";

    DetailCellTableViewCell *cell = (DetailCellTableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DetailCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];


        NSInteger count = [self getMaxSubviews];
        NSInteger y=100;

        for (int i=0; i<count;i++)
        {
            UITextField *dataS = [[UITextField alloc] init];

            dataS.frame=CGRectMake(277, y, 60, 17);

            y=y+17;

            dataS.tag=i+1337;
            dataS.backgroundColor=[UIColor redColor];

            [cell addSubview:dataS];
        }
    }


    if (!useOrigCellFromNib) // Here I can use the original Nib created by IB
    {

        NSString *data = @"Some String";

        [cell.data setText:data];


    }
    else // Use added subviews!
    {

        for (int i=0;i<arrS.count;i++)
        {
            NSManagedObject *s = [arrS objectAtIndex:i];


            UITextView *dataS =[cell viewWithTag:i+1337];

            dataS.text=[NSString stringWithFormat:@"%ld foo", (long)i];
            [cell.data setHidden:YES];

        }

    }

    return cell;
}

2 个答案:

答案 0 :(得分:0)

1你应该重用单元格,调用tableView.dequeueReusableCellWithIdentifier(&#34; CellId&#34;)

获得重复使用的单元格后,

2,您应该删除所有以前添加的自定义子视图

3之后,您可以添加新的子视图

关于&#34;我向下滚动子视图消失,不再显示&#34; 我没有看到任何&#34;细胞&#34;变量

之前
if (cell == nil)

所以你可能不会在这里粘贴重用代码,在这种情况下,滚动后的单元格不会为nil,if(cell == nil)下的代码将不会被调用...

答案 1 :(得分:0)

就像Igor在重复使用单元格时提到的那样,你必须先移除它,然后再添加一个子视图并重新创建子视图。 可能是你不能使用“loadFromNib”和Subclass'UITableViewCell'类并在那里创建你的单元格。

这是swift中的一个例子,但ObjC的逻辑也相同

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let stuffArray = array[indexPath.row]

    var cell = tableView.dequeueReusableCellWithIdentifier("Cell")
    if cell == nil {
        cell = MyCustomCell(initWithDaraArray:stuffArray) // create cell based on array data dynamically

    } else { // even if you have cell you need to refresh it for new data
        cell.refreshDataForDataInArray(stuffArray) // here remove all subviews and create new ones
    }

    return cell
}

可以通过

调整单元格高度
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    let stuffArray = array[indexPath.row]
    return calculatedHeight(stuffArray)
}