TableView没有使用正确的TableViewCell

时间:2016-09-27 13:51:40

标签: swift uitableview

我有一个分组的tableview,数据源看起来如下:

let customCell = UITableViewCell()
customCell.textLabel?.text = "this is a custom cell"

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellA", for: indexPath) as! CellA

    cell.label.text = "dummy text"

    switch indexPath.section {
    case 0 :
        switch indexPath.row {
        case 0 : cell.label.text = "Foo"
        case 1 : cell.label.text = "Bar"
        default:
            fatalError("Row does not exist")
        }
    case 1 :
        switch indexPath.row {
        case 0 : return customCell
        default:
            fatalError("Row does not exist")
        }
    default:
        fatalError("Section does not exist")
    }

    return cell
}

func numberOfSections(in tableView: UITableView) -> Int { return 2 }

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch section {
    case 0 : return 2
    case 1 : return 1
    default:
        fatalError("Section does not exist")
    }
}

问题:
我希望第2部分使用customCell,但它仍然使用我使用方法dequeueReusableCell(identifier:,indexPath:)创建的具有虚拟文本"dummy text"的单元格。如果我使用此方法,则不会发生这种情况:dequeueReusableCell(identifier:)(没有indexPath)。

这样做的正确方法是什么,或者我应该使用没有indexPath的方法?

1 个答案:

答案 0 :(得分:1)

因此,您的行为几乎正确,您的customCell也会被添加到tableView。但是这里发生的事情是,首先你dequeueing cellForRowAt中的一个单元格,然后检查section并返回cell。因此,customCell添加了indexPath.section = 1,但dequeued单元格位于其顶部。您可以调试view hierarchy并查看魔法。

现在您必须将cell创作移至个人section并从那里返回,如下所示,它应该有效:

switch indexPath.section {
        case 0:
            let cell = tableVIew.dequeueReusableCellWithIdentifier("cellA", forIndexPath: indexPath) as! cellA
            cell.textLabel?.text = "dummy text"

            switch indexPath.row {
                case 0 :
                    cell.textLabel?.text = "Foo"
                    return cell
                case 1 :
                    cell.textLabel?.text = "Bar"
                    return cell
            default:
                fatalError("Row does not exist")
            }
        case 1:
            switch indexPath.row {
                case 0 :
                    return customCell
            default:
                fatalError("Row does not exist")
            }
        default:
             fatalError("Section does not exist")
     }