当数组的内容属于不同类型时,如何填充多个tableview部分?

时间:2017-10-03 12:55:47

标签: swift

我有一点多态性问题。我有三个数组aList,bList和cList,它们包含不同类型的设备“A”,“B”,“C”。

我想为aList,bList,cList填充一个包含3个部分的tableviewcontroller。但是当我到达时,我有点挣扎:

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

我遇到的问题是理想情况下我在一个阵列中有三个阵列,例如。 section = [aList,bList,cList)。

在我的单例“A”中,“B”,“C”是结构并代表一种设备,因此我将它们更改为类并将它们从“设备”超类继承,然后尝试创建一个数组超类“装备”,但也没有用。

建议会很棒。

class EquipmentListController: UITableViewController {

    var model = SingletonModel.sharedInstance

    var aList:[SingletonModel.A] = []
    var bList:[SingletonModel.B]  = []
    var cList:[SingletonModel.C] = []

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func viewWillAppear(_ animated: Bool) {

        super.viewWillAppear(animated)
        aList = model.AList
        bList = model.BList
        cList = model.CList
        sections.append(aList)
        sections.append(bList)
        sections.append(cList)

    }

    override func numberOfSections(in tableView: UITableView) -> Int {

        return 3
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        switch section{
        case 1:
            self.tableView.rowHeight = 70
            return aList.count
        case 2:
            return bList.count
        case 3:
            return cList.count

        default:
            return 0
        }

    }

我的问题在于下面的线路设备:SingletonModel.A(或B或C) - 基本上我有三个独立的阵列,每个都是不同的类型。

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

        guard let cell = tableView.dequeueReusableCell(withIdentifier: "equipmentcell", for: indexPath) as? EquipmentCell  else
        {

        }

        let equipment: SingletonModel.A (or B or C) = changeDataSource(indexPath: indexPath as NSIndexPath)

        cell.equipmentTitle.text = equipment.equipmentName       
        cell.accessoryType = .disclosureIndicator     
        return cell
    }

    func changeDataSource(indexPath: NSIndexPath) -> SingletonModel.A, B or C
    {
        var equipment:SingletonModel.A (B or C)
        equipment = A, B or C [indexPath.row]
        return equipment
    }

    func tableView(tableView: UITableView!, titleForHeaderInSection section: Int) -> String!
    {
        switch section
        {
        case 1:
            return "A"
        case 2:
            return "B"
        case 3:
            return "C"
        default:
            return nil
        }
    }

    override func tableView(_ tableView: UITableView,
                   heightForHeaderInSection section: Int) -> CGFloat
    {
        return 40
    }

}

由于

3 个答案:

答案 0 :(得分:2)

在indexPath中,您拥有单元格的行和部分:

indexPath.row
indexPath.section

您可以启用indexPath.section

答案 1 :(得分:2)

首先,你需要修改章节编号:章节从零开始编号,而不是从一个编号:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch section {
    case 0:
        return aList.count
    case 1:
        return bList.count
    case 2:
        return cList.count
    default:
        return -1 // Fail fast
    }
}

接下来,更改设置行高的方式:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    // Rows in section 0 are taller
    return indexPath.section == 0 ? 70.0 : 50.0;
}

现在,您可以使用ABC设置您的手机:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "equipmentcell", for: indexPath) as? EquipmentCell  else
    {
        return nil
    }
    var equipment : BaseOfABC = nil
    switch indexPath.section {
    case 0:
        equipment = SingletonModel.A
    case 1:
        equipment = SingletonModel.B
    case 2:
        equipment = SingletonModel.C
    default:
        assert(indexPath.section < 3, "Unknown section")
    }
    cell.equipmentTitle.text = equipment.equipmentName       
    cell.accessoryType = .disclosureIndicator     
    return cell
}

答案 2 :(得分:1)

对于每种(设备)类型,您可以创建自己的细胞类型。

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)

启用indexPath.section,创建匹配的单元格类型,并从匹配(设备)数组中设置其属性。