为啥“switch”语句在设置 UICollectionView 的标题时不起作用?

Posted

技术标签:

【中文标题】为啥“switch”语句在设置 UICollectionView 的标题时不起作用?【英文标题】:Why does "switch" statement not work in setting UICollectionView's header?为什么“switch”语句在设置 UICollectionView 的标题时不起作用? 【发布时间】:2015-12-09 05:56:45 【问题描述】:

我想设置集合视图的标题,从而实现方法func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView

但是,switch 语句似乎不起作用;即使我尝试通过根据部分分支来在标题视图中设置标签,所有部分中的结果标题视图也包含我编写的所有标签。

func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView 
    switch kind 
    case UICollectionElementKindSectionHeader:
        let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "Header", forIndexPath: indexPath)
        let headerLabel = UILabel(frame: CGRectMake(2, 8, 120, 24))
        headerView.addSubview(headerLabel)

        print(indexPath.section)
        switch (indexPath.section) 
        case 0:
            headerLabel.text = "A"
            return headerView
        case 1:
            headerLabel.text = "B"
            return headerView
        default:
            break
        

        return headerView

    default:
        assert(false, "Unexpected element kind")
    

在上面的代码中,两个部分的标签都有标签AB,相互重叠。

为什么开关在我的情况下不起作用?

我的集合视图中的内容从服务器获取数据,因此 print(indexPath.section) 被执行了 2 次,每次打印出 01,按此顺序。

这和问题有关吗?

【问题讨论】:

【参考方案1】:

您正在向标题视图添加一个新标签每次出列时。您应该在标头中已经存在标签(作为原型、xib 文件或在自定义标头类初始化时创建),并且每次只需在问题的方法中设置文本。

如果您不能这样做,则需要在创建标签之前检查标签是否存在。

【讨论】:

【参考方案2】:

案例 1

我认为只有在从服务器获得响应后才需要重新加载集合视图。并会出现初始化视图中的response/tableData数组。

案例 2

您可以尝试在切换条件下使用来自服务器的响应数组数据。

【讨论】:

以上是关于为啥“switch”语句在设置 UICollectionView 的标题时不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 switch 语句在运行时会结束 while 循环?

为啥这个简单的switch语句总是运行默认

为啥 switch 语句没有大括号?

为啥我不能在 switch 语句中使用元组常量作为案例

为啥在 if 语句中初始化字符串似乎与在 switch 语句中不同? [复制]

为啥 Switch 需要语句但接受表达式