以编程方式填充UITableViewCells - Swift

时间:2016-01-12 04:11:32

标签: ios swift uitableview

我正在开发一个基于IOS Swift的项目,该项目使用几个类来自定义UITableViewUITableViewCell。现在,UITableView中的一个单元格内部为UITableView。我想知道在cellForRowAtIndexPath中是否有可能,我也可以在同一个进程中以编程方式填充单元格。

EX:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
  let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! CustomTableViewCell
  ...... do stuff
  cell.detailview.uitableview <!-- populate the cells here?
  .......
  return cell
}

建议?

1 个答案:

答案 0 :(得分:1)

假设有三种不同类型的细胞:

  • class NormalTableViewCell: UITableViewCell:这用于&#34;常规&#34;外(主)表视图的单元格。
  • class TableContainingTableviewCell : UITableViewCell:这用于&#34;特殊&#34; 外部(主)表视图的单元格,其中包含表格视图(内部)。

  • class InnerTableViewCell : UITableViewCell:这用于内部表格视图的单元格(类TableContainingTableviewCell的单元格中包含的单元格)。

(按实际的班级名称替换每个。)

,您可以使用此代码:

override func viewDidLoad()
{
    super.viewDidLoad()

    // This can also be done in storyboard with prototype cells:
    self.tableView.registerClass(NormalTableViewCell.class, forCellReuseIdentifier: normalCellIdentifier)
    self.tableView.registerClass(TableContainingTableViewCell.class, forCellReuseIdentifier: specialCellIdentifier)
}

override func tableView(tableView: UITableView, 
    cellForRowAtIndexPath indexPath: NSIndexPath
) -> UITableViewCell 
{
    if tableView == self.tableView {
        // [A] OUTER TABLE VIEW

        if indexPath == index path of table-containing cell {
            // (A.1) TABLE-CONTAINING CELL

            let cell = tableView.dequeueReusableCellWithIdentifier(specialCellIdentifier, forIndexPath: indexPath) as! TableContainingTableViewCell

            // (...configure cell...)

            // Setup and refresh inner table view: 

            cell.contentView.tableView.dataSource = self

            // This is needed for dequeueing to succeed:
            cell.contentView.tableView.registerClass(InnerTableViewCell.class, forCellReuseIdentifier: innerCellIdentifier)

            cell.contentView.tableView.reloadData()
            // ^ THIS TRIGGERS A CALL TO THIS FUNCTION, ON THE
            // INNER TABLE VIEW (PATH [B] BELOW)

            return cell
        }
        else {
            // (A.2) NORMAL CELL

            let cell = tableView.dequeueReusableCellWithIdentifier(normalCellIdentifier, forIndexPath: indexPath) as! NormalTableViewCell

            // (configure cell)

            return cell
        }
    }
    else {
        // [B] INNER TABLE VIEW

        let cell = tableView.dequeueReusableCellWithIdentifier(innerCellIdentifier, forIndexPath: indexPath) as! InnerTableViewCell

        // (configure cell)            

        return cell
    }
}

...但我坚决反对在另一个表格视图的单元格中嵌入表格视图。至少,确保内部表视图不需要滚动(即,包含单元格足够高以显示所有行,并且表本身已禁用滚动)。