我正在用表格视图制作表单。
比方说,我有4种不同类型的单元格,每个单元格都是一个具有不同答案的问题
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if sortedFixedContentType.count != 0 {
let item = sortedFixedContentType[indexPath.row]
switch item.typeId {
case "1":
let cell = tableView.dequeueReusableCell(withIdentifier: "FirstCell", for: indexPath) as! FirstCell
return cell;
case "2":
let cell = tableView.dequeueReusableCell(withIdentifier: "SecondCell", for: indexPath) as! SecondCell
cell.customDelegate = self
return cell;
case "3":
let cell = tableView.dequeueReusableCell(withIdentifier: "ThirdCell", for: indexPath) as! ThirdCell
cell.commentsTextView.delegate = self
return cell;
case "4":
let cell = tableView.dequeueReusableCell(withIdentifier: "FourthCell", for: indexPath) as! FourthCell
return cell;
}
加载tableView时,我只想显示第一个单元格,并且根据答案,将显示不同的单元格。
例如:
可以用 A , B 或 C ,来回答FirstCell
如果我回答 A ,SecondCell
会显示为答案 X 和 Y 。
如果 X 是答案,将显示ThirdCell
(除了TextField之外没有其他选项),完成后将显示FourthCell
但是,如果在FirstCell
中答案是 B 或 C ,则仅直接显示FourthCell
。< / p>
目前,我正在通过更改heightForRowAt
中行的高度来做到这一点,尽管我认为必须有一种更简单的方法。
但是我发现一个问题:
如果我到达ThirdCell
中的textField,然后更改了第一个答案,则SecondCell
被隐藏,而ThirdCell
不是,因为条件是第二个答案,它是已经完成,所以我考虑将每行的高度设置为条件,但是我不知道该怎么做。
所以我有两个主要问题:
是否可以访问heightForRowAt
并将其设置为条件?
我应该这样吗?还是有更好的方法来获取我需要的东西?我读了关于动态地向表视图添加和删除行的信息,但是具有相同的单元格类型,这就是为什么我决定按其高度隐藏它们的原因。
谢谢!
答案 0 :(得分:1)
我认为常规方法是不修改高度,而是操纵数据源(节中的行数等)以显示/隐藏适当的单元格。
您应该在事件发生后适当地更新数据源,然后在可以使用func insertRows(at indexPaths: [IndexPath], with animation: UITableView.RowAnimation)
和tableView.deleteRowsAt(at indexPaths: [IndexPath], with animation: UITableView.RowAnimation)
在tableView中插入/删除单元格后立即更新数据源
该文档可能会有所帮助:https://developer.apple.com/documentation/uikit/uitableview/1614879-insertrows
答案 1 :(得分:0)
我通常想做的是监视变量,并在更新变量时调整单元格的高度。确保为变量分配了didSet代码,以便在变量更改时表视图更新高度。
var selectedRow: Int = 999 {
didSet {
tableView.beginUpdates()
tableView.endUpdates()
}
}
然后,就像您所做的那样,我会影响heightForRow函数内部行的高度。
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.row == selectedRow { //assign the selected row when touched
let thisCell = tableView.cellForRow(at: indexPath)
if let thisHeight = thisCell?.bounds.height {
print("Bam we got a HEIGHT!!")
return thisHeight + 50
}
}
return 60 //return a default value in case the cell height is not available
}