cellForRowAt - 从switch语句中创建和返回单元格

时间:2017-07-17 14:52:50

标签: ios swift uitableview

我认为我错过了Swift的一些基本功能,但却无法找到其他人在做我尝试的事情的例子:

背景

我有一个带有2个原型单元的UITableView,具有不同的标识,不同的功能(标签,图像等)和不同的类。

我希望cellForRowAt函数返回不同类型和类的单元格,具体取决于包含表数据的数组中的内容。该数组填充了struct实例,其中一个特性标识了我想要表示数据的单元格类型。

代码尝试

这不是逐字复制/粘贴,但原理是相同的

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       switch dataArray[indexPath.item].typeOfData {
       case "Type1":
          let cell = tableView.dequeueReusableCell(withIdentifier: "type1ReuseIdentifier", for: indexPath) as! type1Cell
          //Set up the cell contents
          return cell
       case "Type2":
          let cell = tableView.dequeueReusableCell(withIdentifier: "type2ReuseIdentifier", for: indexPath) as! type2Cell
          //Set up the cell contents
          return cell
       default
          let cell = tableView.dequeueReusableCell(withIdentifier: "separatorIdentifier", for: indexPath) as! separatorCell
          //Set up the cell contents
          return cell
     }
}

问题是这不起作用,Swift要我在switch语句之外声明并返回单元格,但是我不能这样做,因为单元格类型的声明取决于数据的类型我想创建(因为需要使用typexCell来访问自定义单元格的组件)。

我错过了什么/做错了什么?

1 个答案:

答案 0 :(得分:1)

就这样做:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let typeSection = CellType(rawValue: indexPath.row)!

    switch typeSection {
    case .CenterTitleCell:
        return getCenterTitleCell(tableView, indexPath)
    case .CenterDescriptionCell:
        return getCenterDescriptionCell(tableView, indexPath)
    case .CenterImageCell:
        return getImageCell(tableView, indexPath)
    case .FooterTitleCell:
        return getFooterViewCell(tableView, indexPath)
    }
}

使用另一种方法返回Cell Type

func getCenterTitleCell (_ tableView: UITableView, _ indexPath:IndexPath) -> CenterTitleTableViewCell {
    let cell:CenterTitleTableViewCell =  tableView.dequeueReusableCell(withIdentifier: String(describing: CenterTitleTableViewCell.self),
                                                                                   for: indexPath) as! CenterTitleTableViewCell
    cell.selectionStyle = .none
    return cell
}