我在点击表视图行时正在扩展行。我的逻辑很简单我在点击可见行时添加了一个额外的行(即扩展),我删除它,即在挖掘可见行时删除/折叠添加的行。现在我有4个带有单独XIB的自定义单元,即A,B,C,D,所有这些单元都包含在一个类中。现在问题是这样的,考虑我在第0行扩展单元格A,下一行也是类型A,然后实例进入第二个开放单元格,当我点击第一个打开的单元格时,它崩溃了。现在我有两个解决方案,首先是一次只显示一个单元格,如果有的话,折叠所有剩余的开放单元格,或者解决不能获取单元格实例的崩溃问题。我试图通过创建
来解决第一个问题 let indexPath : IndexPath = IndexPath(row: sender.view!.tag, section: 0)
self.expansionCell = self.myTableView.cellForRow(at: indexPath) as! CustomCell
但它仍然崩溃。
第二个我试过下面的
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){
if isExpanded == true
{
print("Expanded Row",self.expandedIndex)
//Function to contract Cell which holds old expanded cell index
self.contractExpandedCell(tableView: tableView, index: self.expandedIndex)
}
//Setting Selected index path
self.selectedIndexPath = indexPath as NSIndexPath
if myArray[indexPath.row] != nil {
let cell = myTableView.cellForRow(at: indexPath) as! CustomCell
// If user clicked last cell, do not try to access cell+1 (out of range)
if(indexPath.row + 1 >= (myArray.count)) {
DispatchQueue.main.async {
cell.forwardArrowImage.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI_2))
}
self.isExpanded = true
//Function to expand Cell
expandCell(tableView: tableView, index: indexPath.row)
}
else {
// If next cell is not nil, then cell is not expanded
if(myArray[indexPath.row+1] != nil) {
DispatchQueue.main.async {
cell.forwardArrowImage.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI_2))
}
self.isExpanded = true
self.expandCell(tableView: tableView, index: indexPath.row)
} else {
// Close Cell (remove ExpansionCells)
DispatchQueue.main.async {
cell.forwardArrowImage.transform = CGAffineTransform(rotationAngle: CGFloat(180.0 * M_PI))
}
self.isExpanded = false
contractCell(tableView: tableView, index: indexPath.row)
}
}
}
}
//Function to expand cell
private func expandCell(tableView: UITableView, index: Int) {
// Expand Cell (add ExpansionCells)
if (myArray[index]?.title) != nil {
myArray.insert(nil, at: index + 1)
self.expandedIndex = index + 1
questionAnswerTable.insertRows(at: [IndexPath(row: index + 1, section: 0)], with: .top)
}
}
//Function to contract cell
private func contractCell(tableView: UITableView, index: Int) {
if (myArray[index]?.title) != nil {
myArray.remove(at: index + 1)
questionAnswerTable.deleteRows(at: [IndexPath(row: index + 1, section: 0 )], with: .top)
}
}
即使这样也不能顺利进行,因为添加行时行数会发生变化,如果我尝试展开下一个单元格,则会打开第三个单元格。
任何一种解决方案都可行。 请帮帮我们TIA
答案 0 :(得分:0)
添加
var currentExpandIndexpath:NSIndexpath?
并在didSelectRowAt
更改
expandCell(tableView: tableView, index: indexPath.row)
与
if currentExpandIndexpath == nil{
currentExpandIndexpath = indexpath
}
if currentExpandIndexpath == indexpath{
// do nothing
}else{
// contract expand cell before expand new cell
contractCell(tableView: tableView, index: currentExpandIndexpath.row)
self.expandCell(tableView: tableView, index: indexPath.row)
// update current expand cell
currentExpandIndexpath = indexpath
}
这只是解决方案。代码不正确。
答案 1 :(得分:0)
这是一个简单的逻辑。获取一个变量来存储选定的索引路径。
当点击DidSelectRowAtIndexPath存储的任何单元格选择为该变量并重新加载表时。
当表重载高度行方法检查索引路径时。如果indexpath等于变量中的indexpath存储,则该行应该具有比其他行更大的大小。
这只是简单的逻辑