晚上好
我有一个UITableView与展开部分。它的作品很棒,但是,如果我有一个部分展开,我选择一个新的部分,这两个部分将展开。我正在尝试强制关闭已打开的部分,因此一次只能打开一个部分。
var currentlyOpenedSection = -1
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
if indexPath.row == 0{
if currentlyOpenSection != indexPath.section && currentlyOpenSection != -1{
// FORCE CLOSE currentlyOpenedSection
Section_List[currentlyOpenSection].isOpened = false // Bool that tracks if this cell is open or not, read by "numberOfRowsInSection" function
}
Section_List[indexPath.section].isOpened = !Section_List[indexPath.section].isOpened // This flip flops the bool that tracks if this section is open, again read by the function "numberOfRowsInSection" to determine how many cells to dedicate to this section
if Section_List[indexPath.section].isOpened {
currentlyOpenSection = indexPath.section // store the new value
} else {
currentlyOpenSection = -1 // or reset the value to show that none are currently open
}
}
tableView.reloadSections([indexPath.section], with: .none)
}
这是我得到的错误消息:"无效更新:无效的行数在第0节。更新后(1)的现有部分所包含的行数必须等于更新前(4)的部分所包含的行数,加上或减去从该部分插入或删除的行数(0插入,0删除),加上或减去从该部分移进或移出的行数(0移进,0移出)。
这个错误信息是完全有意义的,因为我只是隐藏单元格在部分,不添加或删除单元格,但我不知道如何克服它。
我在几年前发现了这个关于堆栈溢出的问题,但唯一的答案只是告诉我这是可能的,而不一定是如何实际做到的。一次展开和收缩一行UITableView swift
任何想法吗?谢谢你的宝贵时间。
在输入我的问题后,我有了一个想法,并决定尝试一下,它奏效了。既然我已经把问题打出来了,我想我应该把答案贴在这里。
我所要做的就是在声明该section为closed (set isOpened = false)后重新加载它。下面的新代码,空格表示强调:
var currentlyOpenedSection = -1
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
if indexPath.row == 0{
if currentlyOpenSection != indexPath.section && currentlyOpenSection != -1{
// FORCE CLOSE currentlyOpenedSection
Section_List[currentlyOpenSection].isOpened = false // Bool that tracks if this cell is open or not
tableView.reloadSections([currentlyOpenedSection], with: .none)
}
Section_List[indexPath.section].isOpened = !Section_List[indexPath.section].isOpened
if Section_List[indexPath.section].isOpened {
currentlyOpenSection = indexPath.section
} else {
currentlyOpenSection = -1
}
}
tableView.reloadSections([indexPath.section], with: .none)
}