当你想要什么都不返回时,从collectionView(_:viewForSupplementaryElementOfKind:at :)返回什么?

Gol*_*Joe 15 ios uicollectionview swift

我有一个UICollectionView具有节标题,但没有节页脚.因此,我没有明确的页脚视图. Apple的文档说明了这一点You must not return nil from this method.

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    switch kind {
    case UICollectionElementKindSectionHeader:
        let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind,
                                                                         withReuseIdentifier: "MyHeaderView",
                                                                         for: indexPath) as! MyHeaderView
        switch indexPath.section
        {
        case 0:
            headerView.label_title.text = "SOME HEADER"
        case 1:
            headerView.label_title.text = "ANOTHER HEADER"
        default:
            headerView.label_title.text = "UNKNOWN HEADER"
        }
        return headerView
    default:
        assert(false, "Unexpected element kind") // Not a good idea either
    }
    return nil // NOPE, not allowed
}
Run Code Online (Sandbox Code Playgroud)

Ahm*_*edr 12

以上都不适合我.在我的情况下,我UICollectionView在同一个视图控制器中有两个对象.首先是水平的,选择一个项目显示UICollectionView垂直的下方并包含节标题.

来自Apple文档:

此方法必须始终返回有效的视图对象.如果您不希望在特定情况下使用补充视图,则布局对象不应为该视图创建属性.或者,您可以通过将相应属性的isHidden属性设置为true或将属性的alpha属性设置为0来隐藏视图.要在流布局中隐藏页眉和页脚视图,还可以设置这些视图的宽度和高度到0.

所以headerView像往常一样出列,因为如果你不这样做,只是返回一个UICollectionReusableView()Xcode 实例就会抱怨标题视图没有出列.然后,如果你不想出于某种原因显示它(对我来说,直到用户从上部水平集合视图中选择一个项目) - 设置headerViewto 的宽度和高度0.0并返回它.

let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: collectionHeaderReuseIdentifier, for: indexPath) 
if objects.isEmpty {
    headerView.frame.size.height = 0.0
    headerView.frame.size.width = 0.0
    return headerView
}
// Configure the header view here if needed
return headerView
Run Code Online (Sandbox Code Playgroud)


Pit*_*ont 6

就我个人而言,如果您没有告诉 UICollectionView 显示节页脚,那么它不会显示它们。所以可以放入preconditionFailure那个委托方法。

我的想法是, UICollectionView 不会做你告诉它做的更多的事情。因此,如果您没有告诉 UICollectionView 显示部分页脚,那么它不会显示它们,并且preconditionFailure对于那些页脚视图来说是安全的。但是,如果您在这种情况下发现崩溃,那么要么是 UIKit 错误,您应该为此提交雷达以告诉 Apple,要么是您的错误要求 UICollectionView 无意中显示部分页脚。

所以我的代码看起来类似于这个

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
  switch kind {
  case UICollectionElementKindSectionHeader:
      let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind,
                                                                     withReuseIdentifier: "MyHeaderView",
                                                                     for: indexPath) as! MyHeaderView
      /* Configure your section header here */
      return headerView
  default:
      preconditionFailure("Invalid supplementary view type for this collection view")
  }
}
Run Code Online (Sandbox Code Playgroud)