当您啥都不返回时,从 collectionView(_:viewForSupplementaryElementOfKind:at:) 返回啥?

Posted

技术标签:

【中文标题】当您啥都不返回时,从 collectionView(_:viewForSupplementaryElementOfKind:at:) 返回啥?【英文标题】:What to return from collectionView(_:viewForSupplementaryElementOfKind:at:) when you want to return nothing?当您什么都不返回时,从 collectionView(_:viewForSupplementaryElementOfKind:at:) 返回什么? 【发布时间】:2017-06-30 09:23:41 【问题描述】:

我有一个 UICollectionView,它有节页眉,但没有节页脚。因此,我没有定义的页脚视图。 Apple's documentation 声明 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

【问题讨论】:

这样返回空的UICollectionReusableView() @Dharma NOPE,它会崩溃! 【参考方案1】:

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

来自Apple docs:

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

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

【讨论】:

【参考方案2】:

就我个人而言,如果您没有告诉 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")
  

【讨论】:

【参考方案3】:

尝试如下

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView 
       var headerView = UICollectionReusableView()
    if kind == UICollectionElementKindSectionHeader 
        headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "HeaderViews", for: indexPath)

    
    return headerView

【讨论】:

这将导致其他部分崩溃,因为您正在强制包装headerview @NiravD 谢谢。我忘记了。现在我更新我的答案。【参考方案4】:

如您所见,viewForSupplementaryElementOfKind 方法返回 UICollectionReusableView,它不是 可选类型,因此您必须初始化 UICollectionReusableView 对象并返回该对象如下面的例子,当你不想返回任何东西时。

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView 

return UICollectionReusableView ()


【讨论】:

【参考方案5】:

我猜你可以返回空视图。它不会指定任何大小。

 retun UIView()

【讨论】:

【参考方案6】:

尝试使用

return UICollectionReusableView()

【讨论】:

以上是关于当您啥都不返回时,从 collectionView(_:viewForSupplementaryElementOfKind:at:) 返回啥?的主要内容,如果未能解决你的问题,请参考以下文章

返回executeFetchRequest的NSArray:结果时我应该保留,自动释放还是啥都不做?

NSFetchedResultsController 啥都不返回

如何让函数啥都不返回?

C# 要么返回 false 要么啥都不做

localhost/test.php 啥都不返回

Facebook Graph API 我/朋友啥都不返回