无法在UIView xib中向UICollectionView添加项目

时间:2016-07-09 19:18:27

标签: ios swift uiview uicollectionview uicollectionviewcell

目的

我想将我的(BusinessViewTableHeader:UIView)作为tableView标题放置:

tableView.tableHeaderView = BusinessViewTableHeader.instanceFromNib() as! BusinessViewTableHeader

在BusinessViewTableHeader中有一个UICollectionView,它应该在刷卡时显示图像,就像Tinder应用程序一样。

这是我的UIView子类:

class BusinessViewTableHeader: UIView {

    @IBOutlet var collectionView: UICollectionView!

    override func awakeFromNib() {
        super.awakeFromNib()
        self.collectionView.delegate = self
        self.collectionView.registerNib(UINib(nibName: "BusinessImageCollectionCell", bundle: nil), forCellWithReuseIdentifier: "BusinessImageCollectionCell")
    }

    class func instanceFromNib() -> UIView {
        return UINib(nibName: "BusinessViewTableHeader", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! UIView
    }

    ....
}

extension BusinessViewTableHeader: UICollectionViewDelegate, UICollectionViewDataSource {
    ....
}

问题

我有一个包含UICollectionView的自定义UIView xib。问题是我无法将任何单元格(项)添加到UICollectionView。我可以将项添加到放在UIViewController中的其他UICollectionView。第一个图像显示UIViewController内UICollectionView的属性,第二个图像显示UIView xib内的UICollectionView。

UICollectionView in UIViewController [UICollectionView in UIView xib 2

问题

为什么我无法在UIView xib中的UICollectionView中添加项目?有没有办法做到这一点?

5 个答案:

答案 0 :(得分:23)

当UICollectionView在Nib上时,您不能拥有UICollectionViewCell。您需要做的是将UICollectionViewCell创建为另一个nib,并将其注册到您用于CollectionView的类中。

创建一个新的nib,在其中拖动一个UICollectionViewCell,并在与UICollectionView一起使用的类中执行类似的操作。

override func awakeFromNib() {
    let nibName = UINib(nibName: "ClassCollectionCell", bundle:nil)
    collectionView.registerNib(nibName, forCellWithReuseIdentifier: "collectionCell")
}

请记住,您可以向UICollectionViewCell添加自定义类,以便将动态数据传递给它。

答案 1 :(得分:1)

不支持在xib中添加单元格。如果必须使用xib文件,则需要一个包含UICollectionView单元的单独xib。故事板可能是更好的解决方案。

目前尚不清楚您要实现的目标。 UICollectionView具有用于创建使用数据源和委托的标头的特定方法。集合视图适用于以网格布局或其他复杂布局显示项目。

如果你只需要显示一个行列表,那么UITableViewController可能是一个更容易的选择。

无论如何,最好使用一个storyboard而不是一个xib,并将UICollectionViewController或UITableViewController子类化,而不是子视图。

您的自定义类名可以在UIViewController或UIView的身份检查器中输入:

UIViewController identity inspector

UIView identity inspector

答案 2 :(得分:1)

Swift 3.0 中使用以下方法注册nib -

let nibName = UINib(nibName: "FruitCell", bundle:nil)
collectionView.register(nibName, forCellWithReuseIdentifier: "CellIdentifier")

答案 3 :(得分:1)

在Swift 3.0中

首先创建UIView的Xib文件

import UIKit

class SubCatagoryListView:UIView , UICollectionViewDelegate , UICollectionViewDataSource
{
    @IBOutlet weak var mainView: UIView!
    @IBOutlet weak var btnClose: UIButton!
    @IBOutlet weak var subCategoryListCollectionView: UICollectionView!
    @IBOutlet weak var lblTitle: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        subCategoryListCollectionView.register(UINib(nibName: "SubcatagoryListCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "SubcatagoryListCollectionViewCell")
        mainView.layer.cornerRadius = 10.0
        mainView.clipsToBounds = true
    }
    static func subCatagoryListView() -> SubCatagoryListView? {
        let arr = Bundle.main.loadNibNamed("SubCatagoryListView", owner: self, options: nil)
        if arr != nil {
            if arr!.count > 0 {
                if let view = arr![0] as? SubCatagoryListView {

                    return view;
                }
            }
        }

        return nil;
    }





    @IBAction func btnBackgroundTapped(_ sender: UIButton)
    {
         self.removeFromSuperview()
    }
    @IBAction func btnCloseTapped(_ sender: UIButton)
    {
        self.removeFromSuperview()
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {


        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SubcatagoryListCollectionViewCell", for: indexPath) as! SubcatagoryListCollectionViewCell

        return cell
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: IndexPath) -> CGSize {
        let cellsize = CGSize(width: (subCategoryListCollectionView.bounds.size.width/3) - 10, height: 50)
        return cellsize
    }


}

创建新的CollectionViewCell Xib文件后

import UIKit

class SubcatagoryListCollectionViewCell: UICollectionViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

}

创建两个文件后,我在我的storybord上加载xib

var subcatagoryXib:SubCatagoryListView?

override func awakeFromNib() {
        super.awakeFromNib()
        if let subcategoryView = SubCatagoryListView.subCatagoryListView()
        {

            subcatagoryXib = subcategoryView
        }

    }
 @IBAction func btnAddInterestTapped(_ sender: UIButton) {

        if subcatagoryXib != nil
        {
            self.subcatagoryXib!.frame = CGRect(x:0, y: 0, width: self.view.frame.width , height: self.view.frame.height)
            self.view.addSubview(self.subcatagoryXib!)
        }

    }

答案 4 :(得分:0)

与@Pato的答案相同,但这是来自Medium上@aestusLabs的how to add a customized UICollectionViewCell inside a Xib file的更详尽的教程。这是3-5分钟的阅读时间,我个人认为这非常有帮助。基本上,它告诉您使用.xib创建另一个自定义的UICollectionViewCell,并将其注册到“级别1”单元格的awakeFromNib()中。

https://medium.com/@aestusLabs/adding-a-uicollectionviews-to-a-custom-uitableviewcell-xib-tutorial-swift-4-xcode-9-2-1ec9ce4095d3