UICollectionView 中的多个部分

Posted

技术标签:

【中文标题】UICollectionView 中的多个部分【英文标题】:Multiple Section in UICollectionView 【发布时间】:2017-06-22 06:26:01 【问题描述】:

我正在使用集合视图为我的医院构建一个 ios 应用程序。但是,我需要为专科诊所使用多个部分,具体取决于目的。如果仅针对 1 部分,我已经完成了代码。当我尝试将其分成 2 个部分时,它总是返回一个 nil 值。

请检查我下面的代码

public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)

    if indexPath.section == 0 
        var buttonSpecialist = cell.viewWithTag(1) as! UIButton

        buttonSpecialist.setTitle(list[indexPath.row].SpecialtyName, for: .normal)

        let btnimg = try? UIImage(data: Data(contentsOf: URL(string: list[indexPath.row].ImageUrl)!))

        var newimg = imageResize(image: btnimg as! UIImage, scaledTo: CGSize(width: 50, height: 50))

        buttonSpecialist.setImage(newimg, for: .normal)
        buttonSpecialist.contentMode = .center
        buttonSpecialist.imageView?.contentMode = .scaleAspectFit

        //let sign: Int = imageOnTop ? 1 : -1
        let imageSize: CGSize? = buttonSpecialist.imageView?.frame.size
        buttonSpecialist.titleEdgeInsets = UIEdgeInsetsMake(((imageSize?.height)! + 5) * 1, -(imageSize?.width)!, 0, 0)
        let titleSize: CGSize? = buttonSpecialist.titleLabel?.bounds.size
        buttonSpecialist.imageEdgeInsets = UIEdgeInsetsMake(-((titleSize?.height)! + 5) * 1, 0, 0, -(titleSize?.width)!)

        cell.layer.borderWidth = 1.0
        cell.layer.borderColor = UIColor.black.cgColor
    
    else if indexPath.section == 1 
        var buttonSpecialist = cell.viewWithTag(1) as! UIButton

        buttonSpecialist.setTitle(list2[indexPath.row].SpecialtyName, for: .normal)

        let btnimg = try? UIImage(data: Data(contentsOf: URL(string: list2[indexPath.row].ImageUrl)!))

        var newimg = imageResize(image: btnimg as! UIImage, scaledTo: CGSize(width: 50, height: 50))

        buttonSpecialist.setImage(newimg, for: .normal)
        buttonSpecialist.contentMode = .center
        buttonSpecialist.imageView?.contentMode = .scaleAspectFit

        //let sign: Int = imageOnTop ? 1 : -1
        let imageSize: CGSize? = buttonSpecialist.imageView?.frame.size
        buttonSpecialist.titleEdgeInsets = UIEdgeInsetsMake(((imageSize?.height)! + 5) * 1, -(imageSize?.width)!, 0, 0)
        let titleSize: CGSize? = buttonSpecialist.titleLabel?.bounds.size
        buttonSpecialist.imageEdgeInsets = UIEdgeInsetsMake(-((titleSize?.height)! + 5) * 1, 0, 0, -(titleSize?.width)!)

        cell.layer.borderWidth = 1.0
        cell.layer.borderColor = UIColor.black.cgColor
    

这里的主要问题是,我不知道如何为特定部分设置特定单元格。我已经在函数“cellforindexpath”中使用了“IF”,但它没有用。

这是我在部分中的退货数量

func numberOfSections(in collectionView: UICollectionView) -> Int 
    // #warning Incomplete implementation, return the number of sections
    return 2



func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    // #warning Incomplete implementation, return the number of items

    if section == 0 
        return list.count
    
        else if section == 1
            return list2.count
        

    return 0


请帮帮我

【问题讨论】:

添加 numberofSection 方法。 你在方法 numberOfSections(in:) 中返回的值是多少?您确定条件“indexPath.section == 1”的代码段实际执行了吗? @christ2702 你把单元格设为 nil 吗? 【参考方案1】:

确保将 DataSource 和 Delegate 分配给 CollectionView

1.使用下面的方法给出你想要显示的部分的数量

func numberOfSections(in collectionView: UICollectionView) -> Int 
    return 2

2.使用以下方法为CollectionView设置每个部分的项目数。

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
   return (section == 0) ? list.count : list2.count

3.将每个项目的单元格分配给CollectionView。

public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

    //If you are using multiple cells based on section make condition 

     if indexPath.section == 0 
             //make sure the identifier of your cell for first section
             let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell1", for: indexPath)
            // do your stuffs
             return cell
     else
             //make sure the identifier of your cell for second section
             let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell2", for: indexPath)
            // do your stuffs
             return cell
      


【讨论】:

我想要同一个单元格,但是单元格内的内容不同 @christ2702 然后简单地将 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell1", for: indexPath) 放在顶部方法中。 还有 1 个问题。如何在每个部分中添加部分标题? 请检查我的另一个问题:***.com/questions/44614743/…【参考方案2】:

如果在这种情况下您有不同的单元格布局要求,您应该使用具有不同重用标识符的不同自定义单元格。正如我在您的代码中看到的那样,您具有相同的单元格布局和不同的数据源。

所以我想说尝试子类化collectionview单元并通过xib或storyboard在子类中为按钮放置一个IBOutlet属性。

你可以参考这个问题: how to create custom UICollectionViewCell

【讨论】:

以上是关于UICollectionView 中的多个部分的主要内容,如果未能解决你的问题,请参考以下文章

一个UIViewController中的多个UICollectionView数据源

部分之间的多个自定义 TableviewCell 上的多个自定义 UICollectionView

UICollectionView 多个部分和标题

使用 IGListKit 或 UICollectionView 每行多个部分

如何在一个视图中添加多个部分 UICollectionView 单元格

UIView 容器中的 Swift-UICollectionView