Не могу добавить элементы в UICollectionView внутри UIView Xib

Задача

Я хочу разместить мой (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 {
    ....
}
проблема

У меня есть пользовательский xib UIView, содержащий UICollectionView. Проблема в том, что я не могу добавить любые ячейки (элементы) в UICollectionView. Я могу добавить элементы в мой другой UICollectionView, которые находятся внутри UIViewController. Первое изображение показывает свойства для UICollectionView внутри UIViewController, второе изображение показывает UICollectionView внутри UIView xib.

[2

Вопрос

Почему я не могу добавить элементы в UICollectionView внутри UIView xib? Есть ли способ сделать это?

 Starlord09 июл. 2016 г., 21:21
Есть ли у вас UIViewController, подключенный к вашей XIB с источником данных и делегировать к вашему UICollectionView?
 ayaio10 июл. 2016 г., 13:17
Пожалуйста, не включайте ответ в свой вопрос. Если ответ решил вашу проблему, пометьте ответ как принятый; Вы также можете опубликовать свой собственный ответ, если вы решили свою проблему самостоятельно. Спасибо.
 rilar09 июл. 2016 г., 21:48
Я только что обновил свой вопрос с помощью некоторого кода. Я подклассифицирую UIView, а не UIViewController. Это возможно даже с подпредставлениями? Я создаю представление заголовка представления таблицы.

Ответы на вопрос(4)

В Swift 3.0

Сначала создайте Xibfile из UIView

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
    }

}

после создания обоих файлов я загружаю XIB на моем storybord

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

    }

Добавление ячеек в xib не поддерживается. Если вы должны использовать файл XIB, то вам понадобится отдельный XIB, который содержит ячейку UICollectionView. Раскадровки могут быть лучшим решением.

Не ясно, чего вы пытаетесь достичь. UICollectionView имеет специальные средства для создания заголовков, которые используют источник данных и делегат. Представления коллекции хороши для отображения элементов в виде сетки или других сложных схем.

Если все, что вам нужно, это отобразить список строк, то UITableViewController может быть более простой альтернативой.

В любом случае, вероятно, лучше использовать раскадровку вместо xib и создать подкласс UICollectionViewController или UITableViewController, а не подпредставление.

Ваше пользовательское имя класса может быть введено в инспекторе идентичности для UIViewController или UIView:

 rilar10 июл. 2016 г., 06:48
Я обновил свой вопрос с «Цель». Я не знаю, как объяснить это более ясно, чем это. Изображения, которые я прикрепил, просто показывают, что при размещении UICollectionView внутри UIView из xib невозможно добавить какие-либо элементы или ячейки к нему. Это почему? Как мне это сделать? Я действительно хочу иметь tableView.tableHeaderView в виде файла XIB.
Решение Вопроса

когда UICollectionView находится на кончике. Что вам нужно сделать, это создать UICollectionViewCell в качестве другого пера и зарегистрировать его в классе, который вы используете для своего CollectionView.

Создайте новый кончик, перетащите в него UICollectionViewCell и сделайте что-то подобное в классе, который работает с вашим UICollectionView.

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

Помните, что вы можете добавить пользовательский класс в UICollectionViewCell, чтобы вы могли передавать в него динамические данные.

 rilar10 июл. 2016 г., 07:57
Глупая ошибка, я забыл: self.collectionView.dataSource = self. Вы где прямо, хотя, спасибо!
 rilar10 июл. 2016 г., 07:11
Именно так я и сделал, если вы посмотрите выше в моем коде.
 Pato Salazar01 сент. 2017 г., 16:47
Зачем вам это нужно .... вы пытаетесь вызвать метод, который существует в вашем классе представления коллекции ?? ...
 Dilip Tiwari01 сент. 2017 г., 15:34
как подключить iboutlet collectionviewcell из xib к пользовательскому классу collectionview @Pato Salazar
 Pato Salazar10 июл. 2016 г., 07:15
@rilar У вас есть перо с UICollectionVIewCell в нем?

ВSwift 3.0 зарегистрировать перо следующим методом:

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

Ваш ответ на вопрос