我正在UITableViewController中实现可折叠的节标题。
这是我确定每个部分要显示多少行的方法:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return self.sections[section].isCollapsed ? 0 : self.sections[section].items.count
}
有一个结构,其中包含用于“ isCollapsed”的部分信息。
这是我如何切换他们的状态:
private func getSectionsNeedReload(_ section: Int) -> [Int]
{
var sectionsToReload: [Int] = [section]
let toggleSelectedSection = !sections[section].isCollapsed
// Toggle collapse
self.sections[section].isCollapsed = toggleSelectedSection
if self.previouslyOpenSection != -1 && section != self.previouslyOpenSection
{
self.sections[self.previouslyOpenSection].isCollapsed = !self.sections[self.previouslyOpenSection].isCollapsed
sectionsToReload.append(self.previouslyOpenSection)
self.previouslyOpenSection = section
}
else if section == self.previouslyOpenSection
{
self.previouslyOpenSection = -1
}
else
{
self.previouslyOpenSection = section
}
return sectionsToReload
}
internal func toggleSection(_ header: CollapsibleTableViewHeader, section: Int)
{
let sectionsNeedReload = getSectionsNeedReload(section)
self.tableView.beginUpdates()
self.tableView.reloadSections(IndexSet(sectionsNeedReload), with: .automatic)
self.tableView.endUpdates()
}
一切正常,并且动画效果很好,但是在控制台中折叠展开的部分时,我得到了这个[Assert]:
[声明]无法为preReloadFirstVisibleRow(0)确定新的全局行索引
无论是同一个打开的节,关闭(合拢),还是我要打开另一个节并“自动关闭”先前打开的节,都会发生这种情况。
我对数据不做任何事情;这是持久的。
谁能帮助解释所缺少的内容吗?谢谢
您的表视图是否由一堆部分组成,却没有多少实际行?
—
拜伦·库切
您曾经设法解决此问题吗?
—
PaulDoesDev
@ByronCoetsee是的,直到扩展了一个部分。因此,当所有折叠都只是部分标题时。当一个被展开时,它是未展开部分的所有部分标题,然后是部分标题,然后是数据单元。
—
iOSProgrammingIsFun
@PaulDoesDev我做了,但是没有使用这种机制。我完全重写了它,以便它看起来一样,但工作原理完全不同。但是,如果有人可以优雅地解决此问题,或者以某种方式对他人有所帮助,我将在此保留。
—
iOSProgrammingIsFun
@iOSProgrammingIsFun哈哈是的,我认为它看上去好像是一个黑客,它在技术上是,但我的代码可以让量和事实,即它实际上是非常干净的手段自己在晚上睡觉时:P码贴在下面
—
拜伦Coetsee