如何在不使用原型单元的情况下创建tableview单元格?

时间:2017-10-31 11:34:58

标签: ios swift uitableview

在我的tableview中,每个单元格都是不同的,由服务器的JSON响应决定。并且会有无限的可能性。因此,不可能为每种类型的单元定义原型。

例如,一个单元格将具有标签和按钮,另一个单元格具有不同顺序的图像和按钮。

如何在tableview单元格中实现这种动态结构?

目前我正在做的是:在cellForRowAtIndexPath中将视图添加为子视图,但这种方式滚动非常滞后。

如何在不影响性能的情况下实现这一目标

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

    let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! MyCell

    for myview in data[indexPath.row].myviews{
        cell.addSubview(myview)
    }

    return cell

}

2 个答案:

答案 0 :(得分:0)

如果您正在使用表格视图,那么您的内容将垂直滚动,对吧?

您可以水平放置的UI数量存在物理限制。受屏幕尺寸的限制。

所以我猜你的UI部分是在单元格中垂直排列的?

所以不要在单元格中垂直布置按钮,标签,图像,其他按钮和文本字段......

创建一个名为ButtonCell,LabelCell,ImageCell,MultiLineLabelCell,TextFieldCell等的单元格类型......

所以现在,不是创建一个添加了所有这些元素的单元格。而是创建多个单元格,每个单元格包含一种类型的UI。现在,您可以按任何特定顺序将单元格出列(由JSON驱动),并且不会失去性能。

答案 1 :(得分:0)

我看到的唯一解决方案是使用空单元格并根据需要添加/删除子视图。但是,只有在之前未添加新子视图时,才应将新子视图添加到单元格中。 例如:

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

    let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! MyCell

    if cell.contentView.viewWithTag(1) == nil {
        let label = UILabel()
        label.tag = 1
        cell.contentView.addSubview(label)
    }

    let label = cell.contentView.viewWithTag(1)
    // label config there

    return cell

}

另外,不要忘记将子视图添加到单元格的内容中,而不是单元格本身。