早上好
我创建了一个自定义的TableViewCell,它内部有一个CollectionViewCell和一个方向箭头。我能够让细胞膨胀和折叠但是当我扩展一个细胞时我想要它,然后我点击另一个细胞以前的崩溃。示例:如果单元格被展开并且单元格被轻敲,我希望单元格收缩,单元格同时展开。因此,在任何给定时刻,只有一个单元格可以处于展开状态,从而更改目标箭头。
示例:
如果cellA被扩展并且tapB被轻击,我希望cellA收缩并且cellB同时扩展。因此,在任何给定时刻,只有一个细胞可以处于扩张状态,从而改变目标箭头。
我的代码:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
switch(selectedIndexPath)
{
case nil:
let cell = myTableView.cellForRow(at: indexPath) as! TableViewCell
cell.arrowImagem.image = UIImage(named:"content_arrow2")
selectedIndexPath = indexPath
default:
if selectedIndexPath! == indexPath
{
let cell = myTableView.cellForRow(at: indexPath) as! TableViewCell
cell.arrowImagem.image = UIImage(named:"content_arrow")
//cell.reloadInputViews()
selectedIndexPath = nil
}
}
self.myTableView.beginUpdates()
self.myTableView.reloadData()
//myTableView.reloadRows(at: [indexPath], with: .automatic)
self.myTableView.endUpdates()
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
let index = indexPath
if selectedIndexPath != nil{
if(index == selectedIndexPath)
{
return 147
}
else{
return 67
}
}
else
{
return 67
}
}
答案 0 :(得分:0)
你可以这样做,但你需要做一些编码。首先检测何时选择一行(保持变量中所选行的索引路径)。当选择一行时,您将添加新选定行的索引路径以及之前选择的索引路径(您在变量中的那个)在从didSelectRowAt内部传递给tableView reloadRows的数组中,此函数将强制重绘将调用两行和heightForRowAt函数来获取两行的高度,在heightForRow中,您将检查当前选定的行(您还记得我前面提到的变量吗?)并返回其扩展高度,而其他行则为你返回折叠高度。你应该得到你想要的结果。希望这会有所帮助。
答案 1 :(得分:0)
您可以在didSet
处理程序中实现大部分功能:
var selectedIndexPath: IndexPath? {
didSet {
guard indexPath != oldValue else {
return
}
if let oldValue = oldValue {
let cell = myTableView.cellForRow(at: indexPath) as? TableViewCell
cell?.arrowImagem.image = UIImage(named:"content_arrow")
}
if let indexPath = indexPath {
let cell = myTableView.cellForRow(at: indexPath) as? TableViewCell
cell?.arrowImagem.image = UIImage(named:"content_arrow2")
}
let rowsToUpdate = [indexPath, oldValue].compactMap { $0 }
self.myTableView.beginUpdates()
// I don't think you actually need to reload rows here but keeping your code here...
self.myTableView.reloadRows(at: rowsToUpdate, with: .automatic)
self.myTableView.endUpdates()
}
}
然后在didSelect
:
if indexPath == selectedIndexPath {
selectedIndexPath = nil
} else {
selectedIndexPath = indexPath
}
(未经测试而写)