我有一点多态性问题。我有三个数组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
}
}
由于
答案 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;
}
现在,您可以使用A
,B
或C
设置您的手机:
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
,创建匹配的单元格类型,并从匹配(设备)数组中设置其属性。