web-dev-qa-db-ja.com

UIView xib内のUICollectionViewに項目を追加できません

目的

(BusinessViewTableHeader:UIView)をtableViewヘッダーとして配置します。

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

BusinessViewTableHeader内には、Tinderアプリのように、スワイプしたときに画像を表示するはずのUICollectionViewがあります。

これは私の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のプロパティを示し、2番目の画像はUIView xib内のUICollectionViewを示しています。

UICollectionView in UIViewController [UICollectionView in UIView xib2

質問

UIView xib内のUICollectionViewにアイテムを追加できないのはなぜですか?これを行う方法はありますか?

15
rilar

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に追加して、動的データをそれに渡すことができることを忘れないでください。

24
Pato Salazar

Xibへのセルの追加はサポートされていません。 xibファイルを使用する必要がある場合は、UICollectionViewセルを含む個別のxibが必要になります。ストーリーボードの方が良いソリューションかもしれません。

何を達成しようとしているのか明確ではありません。 UICollectionViewには、データソースとデリゲートを使用するヘッダーを作成するための特定の手段があります。コレクションビューは、アイテムをグリッドレイアウトまたはその他の複雑な配置で表示するのに適しています。

行のリストを表示することだけが必要な場合は、UITableViewControllerがより簡単な代替手段になる可能性があります。

いずれにせよ、サブビューよりも、xibの代わりにストーリーボードを使用し、UICollectionViewControllerまたはUITableViewControllerをサブクラス化する方がおそらく良いでしょう。

カスタムクラス名は、UIViewControllerまたはUIViewのIDインスペクターに入力できます。

UIViewController identity inspector

UIView identity inspector

1
Luke Van In

Swift 3. nibを次の方法で登録します-

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

In Swift 3.

最初にUIViewのXibfileを作成します

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!)
        }

    }
1
Amul4608

@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-1ec9ce4095d

0
Daniel Hu