我有一个分组的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
的方法?
答案 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")
}