如何干净地隐藏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。