使用两个不同的集合视图时重用标识符

时间:2017-08-24 02:13:53

标签: ios swift uicollectionview

嘲笑我。我认为我正在实施两个不同的集合视图。两个集合视图的设置几乎完全相同。

当我将两者都添加到我的视图中时,我的应用会调用错误:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindCell with identifier CollectionViewPantsCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

哪个没有意义,因为我注册的内容与我的CollectionViewShirtCell完全相同。

为了调试,我删除了裤子系列,并重写了我的" cellForItemAt"方法很简单。它适用于一个collectionView。

那么,有什么区别?我在代码中添加了一些注释。

import UIKit

class HomeController: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {

    let collectionViewShirtsIdentifier = "CollectionViewShirtsCell"
    let collectionViewPantsIdentifier = "CollectionViewPantsCell"

    var shirtStore: ShirtStore!
    var pantStore: PantStore!


    public var collectionViewShirts : UICollectionView{

        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = UICollectionViewScrollDirection.horizontal

        let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height/2), collectionViewLayout: layout)
        collectionView.backgroundColor = UIColor.orange
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: collectionViewShirtsIdentifier)

        return collectionView
    }

    public var collectionViewPants : UICollectionView{

        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = UICollectionViewScrollDirection.horizontal

        let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height/2), collectionViewLayout: layout)
        collectionView.backgroundColor = UIColor.blue
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: collectionViewPantsIdentifier)

        return collectionView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.title = "Hanger"
        self.view.addSubview(collectionViewShirts)
       ///... CANT ADD THE SECOND COLLECTION????
       // self.view.addSubview(collectionViewPants)
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if collectionView == self.collectionViewShirts {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: collectionViewShirtsIdentifier, for: indexPath as IndexPath)

            return cell
        }
        else
        {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: collectionViewPantsIdentifier, for: indexPath as IndexPath)

            return cell
        }
    }

    ///... THIS VERSION WORKS IF I ONLY TRY TO MANIPULATE ONE COLLECTION 
    //    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    //        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewShirtsCell", for: indexPath as IndexPath)
    //        
    //        return cell
    //    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int{
        if(collectionView == collectionViewShirts)
        {
            print(shirtStore.allShirts.count)
            return shirtStore.allShirts.count
        }
        else if (collectionView == collectionViewPants)
        {

            return pantStore.allPants.count
        }
        else
        {
            return 5//shoeStore.allShoes.count
        }
    }
}

1 个答案:

答案 0 :(得分:3)

您设置collectionViewShirtscollectionViewPants变量的方式不正确。因此,if中的cellForItemAt:测试正在落到else,您正试图将“裤子”单元格排列为“衬衫”集合视图。

您需要正确声明集合视图:

 public var collectionViewShirts : UICollectionView = {

        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = UICollectionViewScrollDirection.horizontal

        let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height/2), collectionViewLayout: layout)
        collectionView.backgroundColor = UIColor.orange
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: collectionViewShirtsIdentifier)

        return collectionView
    }()

    public var collectionViewPants : UICollectionView = {

        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = UICollectionViewScrollDirection.horizontal

        let collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height/2), collectionViewLayout: layout)
        collectionView.backgroundColor = UIColor.blue
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: collectionViewPantsIdentifier)

        return collectionView
    }()

请注意结束时的=()。这告诉Swift通过调用匿名函数来分配返回的值。

我还建议您使用约束而不是直接设置框架,因为这不适用于视图旋转,并且在初始化集合视图时框架将无法正确设置,因为视图框架仅在调用viewDidLayoutSubviews时设置。

正如我之前提到的,在Storyboard中执行此类操作要简单得多。