如何干净地隐藏UITableView节
采取任何应用程序。
前往设置。
您很有可能会找到带有分组节的UITableView。
大多数应用程序至少使用一个UITableView子类构建,并且经常需要根据用户设置或对功能的访问来显示/隐藏特定部分。
我们没有开箱即用的隐藏功能
UITableView是UIScrollView的子类,自iOS 2.0起就存在,它没有方便的isHidden
属性,因此必须在数据源和委托中处理逻辑。 当逻辑跨越协议实现时,这很快就会变得像意大利面条。
最小化代码复杂度
试图处理每个特定情况并在显示节时将numberOfSections
设置为n ,在隐藏节时将cellForRowAt indexPath
设置为n-1 ,但是当我们必须处理cellForRowAt indexPath
和后续设置中的单个单元逻辑时,这变得很复杂。 有40多个数据源和委托方法可以跟踪,并且代码维护从这里变得很棘手。
有更好的方法。
解决方案
让我们从numberOfRowsInSection
开始,然后return 0
以将Section隐藏 。 这是一个好的开始,但是由于页眉/页脚的填充,我们仍然会以一个空的部分结束,这会占用空间。
调整布局
要调整额外的间距,我们可以覆盖委托方法heightForHeaderInSection
并为隐藏部分返回CGFloat.leastNonzeroMagnitude
。*请注意,此处返回0无效; 高度必须有一个值。
覆盖func tableView(_ tableView:UITableView,heightForHeaderInSection部分:Int)-> CGFloat {
返回shouldHideSection吗? CGFloat.leastNonzeroMagnitude:20
}
如果您已经覆盖titleForHeaderInSection
,则还需要将节标题设置为nil
。
重写func tableView(_ tableView:UITableView,titleForHeaderInSection部分:Int)->字符串? {
返回shouldHideSection吗? nil:“部分标题”
}
*您可能还需要覆盖storyboard中的heightForFooterInSection
或将页脚值设置为<1。