Swift CollectionView排序障碍

时间:2017-07-19 14:26:18

标签: ios swift xcode

我有UICollectionView嵌套在另一个ParentCollectionView,问题是当我设置数据时,数据变得混乱。 “节标题”按顺序设置,但嵌套集合视图不按顺序排列。 这是代码

import UIKit


class HomeView: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {
    @IBOutlet weak var parentCollectionView: UICollectionView!

    @IBOutlet weak var collectionViewHeight: NSLayoutConstraint!

    let viewModel = HomeVM()
    var categories = [ServiceSection]()
    var categoriesReversed = [[String:Any]]()
    var collectionViewTags = Int()


    override func viewDidLoad() {
        super.viewDidLoad()

        self.categories = [ServiceSection(
            section:
                ["id":"2","name":"planet","service":[
                ["id":"1","name":"Sun"]
                    ]
            ]
            ),
            ServiceSection(
                            section:
                            ["id":"2","name":"Animal","service":[
                                ["id":"1","name":"Dog"]
                                ]
                            ])
        ,

            ServiceSection(
                section:
                ["id":"2","name":"Daries","service":[
                ["id":"1","name":"Milk"]
                    ]
                ])
        ,

            ServiceSection(
                section:
                ["id":"2","name":"Meet","service":[
                    ["id":"1","name":"Steak"]
                    ]
                ])

        ]


        let height = (self.parentCollectionView.collectionViewLayout.collectionViewContentSize.height)

        self.collectionViewHeight.constant = height
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        if (collectionView == parentCollectionView)
        {
            return self.categories.count
        }
        else
        {
            collectionView.tag = collectionViewTags
            collectionViewTags += 1
            return 1
        }
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

        if (collectionView == parentCollectionView){
            return 1
        }else{
            let section = self.categories[collectionView.tag].services
            return section.count

        }
    }

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


        if (collectionView == parentCollectionView){
            return collectionView.dequeueReusableCell(withReuseIdentifier: "parentCell", for: indexPath)
        }
        else
        {
            let cell =  collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionCell


            let collection = self.categories[collectionView.tag].services
            let cellData = collection[indexPath.row]
            cell.title.text = cellData.name

            return cell
        }
    }

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAt indexPath: IndexPath) -> CGSize {

        if collectionView == parentCollectionView{

            return CGSize(width: parentCollectionView.frame.width, height: 30)

        }
        return CGSize(width:150,height:80)

    }

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

        if parentCollectionView == collectionView {

            let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "header", for: indexPath) as! CollectionHeader
            header.header.text = self.categories[indexPath.section].name
            return header
        }

        return UICollectionReusableView()
    }


}

1 个答案:

答案 0 :(得分:0)

解决

解释:问题是我将故事板中collectionView的高度设置为“100”,因为我无论如何都会动态设置它(在collectionView加载之后但是,这会导致使用reloadData()时未正确加载视图的奇怪行为。我想操作系统试图做的只是关心屏幕上可见的部分。

第二个问题是由于某些原因(我不知道)我必须使用numberOfSection作为参数从我之前调用的reloadData重新加载部分,我不知道为什么我需要重新加载每个部分(我很乐意为可以解释它的人投票)

简单collectionView取决于身高和身高取决于collectionView

解决方案:我不确定这是否是正确的方法,但它适用于我,我将collectionView高度更改为9000或任何大数字,以便操作系统知道它需要加载整个事物并在调用reloadData()后更正高度。

self.parentCollectionView.reloadData()

let range = Range(uncheckedBounds: (0,  self.parentCollectionView.numberOfSections))
let indexSet = IndexSet(integersIn: range)
self.parentCollectionView.reloadSections(indexSet)

let height = (self.parentCollectionView.collectionViewLayout.collectionViewContentSize.height)
self.collectionViewHeight.constant = height