Сбой IBDesignable с CollectionView при добавлении значения в DataSource - PullRequest
0 голосов
/ 07 июня 2018

Я работаю над небольшим UIView компонентом, который отображает хэштеги в UICollectionView, и по некоторым причинам мне нужно было сделать его "редактируемым" через Интерфейсный Разработчик ... Поэтому я сделал его IBDesignable.

Все работает, за исключением случаев, когда в prepareForInterfaceBuilder я пытаюсь добавить объект к datasource, поэтому в списке что-то отображается при интеграции где-нибудь в раскадровку.

Прибытие на линию self.hashtags.append(hashtag) это вылетает.Если я удаляю эту строку, представление корректно отображается на раскадровке, если я помещаю его снова ---> crash ... После всей моей отладки кажется, что IB не может получить доступ к этому свойству или видит его nil.

Я не могу отладить что-нибудь , Xcode не позволяет мне отлаживать выбранные представления в Storyboard> Editor (работа в macOS Mojave вызывает ошибки).Мой взгляд не имеет .xib, и оба требуют init s

Я также проверил журналы в Console.app и ничего не нашел.Вот основное сообщение об ошибке, выданное раскадровкой:

Main.storyboard: ошибка: IB Designables: не удалось отобразить и обновить состояние автоматического макета для PublishViewController (tSg-9E-Vz3): агент выбросилисключение.

Код (что имеет значение)

@IBDesignable
class HashtagView: UIView {

    @IBOutlet weak var height: NSLayoutConstraint?

    var collectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        let view = UICollectionView(frame: .zero, collectionViewLayout: layout)
        return view
    }()

    open var hashtags: [HashTag] = []

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        setup()

        self.hashtags.append(HashTag(word: "it works")) < CRASH
        self.collectionView.reloadData()
        self.layoutSubviews()
    }
}

Функция настройки ()

func setup() {
    self.backgroundColor = UIColor.clear
    self.backgroundColor = UIColor.Custom.ligthGray
    self.clipsToBounds = true
    self.layer.cornerRadius = self.cornerRadius

    let alignedFlowLayout = AlignedCollectionViewFlowLayout(horizontalAlignment: .left, verticalAlignment: .top)
    alignedFlowLayout.minimumLineSpacing = 5.0
    alignedFlowLayout.minimumInteritemSpacing = 7.0
    alignedFlowLayout.sectionInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)

    self.collectionView.collectionViewLayout = alignedFlowLayout
    self.collectionView.translatesAutoresizingMaskIntoConstraints = false

    self.collectionView.delegate = self
    self.collectionView.dataSource = self
    self.collectionView.backgroundColor = UIColor.clear
    self.collectionView.isScrollEnabled = false

    self.collectionView.register(UINib(nibName: "RemovableTagCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "RemovableTagCollectionViewCell")

    self.addSubview(self.collectionView)

    self.collectionView.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
    self.collectionView.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
    self.collectionView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
    self.collectionView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
}

1 Ответ

0 голосов
/ 08 июня 2018

Так что настройка была определенно актуальной.Очевидно, IB зависал, пытаясь загрузить вашу ячейку для вашего UICollectionView.Не удалось загрузить файл Nib.Это не имело никакого отношения к добавлению, которое он только что потерпел в то же время.Я повторил вашу проблему, затем создал ячейку с кодом, и все работало нормально.Дайте мне знать, если это поможет и ответит на ваш вопрос.Там есть весь необходимый код.

import UIKit

struct HashTag {
    var word:String?
}

class HashCollectionViewCell: UICollectionViewCell {

    lazy var wordLabel : UILabel = {
        let lbl = UILabel(frame: self.bounds)
        lbl.font = UIFont.systemFont(ofSize: 17)
        lbl.textColor = .black
        return lbl
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.addSubview(wordLabel)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.addSubview(wordLabel)
    }

    func configureWithTag(tag:HashTag) {
        wordLabel.text = tag.word
    }

}

@IBDesignable
class HashTagView: UIView {

    private var sizingLabel = UILabel(frame: .zero)
   lazy var collectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        let view = UICollectionView(frame: self.bounds, collectionViewLayout: layout)
        view.autoresizingMask = [.flexibleWidth,.flexibleHeight]
        return view
    }()

    var hashtags: [HashTag] = [HashTag(word: "this works")]

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }


    func setup(){
        sizingLabel.font = UIFont.systemFont(ofSize: 17)

        self.addSubview(collectionView)
        collectionView.frame = self.bounds
        collectionView.backgroundColor = self.backgroundColor
        collectionView.register(HashCollectionViewCell.self, forCellWithReuseIdentifier: "hashCell")
        self.addSubview(collectionView)

        for x in 0..<10{
            addHashTag(tag: "This is more \(x)")
        }

        collectionView.delegate = self
        collectionView.dataSource = self
    }

    func addHashTag(tag:String){
        let newHash = HashTag(word: tag)
        self.hashtags.append(newHash)
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        collectionView.frame = self.bounds
    }

}

extension HashTagView: UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout{
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return hashtags.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "hashCell", for: indexPath) as? HashCollectionViewCell{
            let tag = self.hashtags[indexPath.item]
            cell.configureWithTag(tag: tag)
            return cell
        }
        return UICollectionViewCell()
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let tag = self.hashtags[indexPath.item]
        sizingLabel.text = tag.word
        sizingLabel.sizeToFit()
        return sizingLabel.frame.size
    }
}

Результат: enter image description here

2) Вы можете загрузить перо всозданная программным способом ячейка, и она будет работать. Пример будет выглядеть следующим образом для части, которая является программной ячейкой.

Код ячейки с расширением View с использованием кончика внутри ячейки:

extension UIView {
    func loadNib() -> UIView {
        let bundle = Bundle(for: type(of: self))
        let nibName = type(of: self).description().components(separatedBy: ".").last!
        let nib = UINib(nibName: nibName, bundle: bundle)
        return nib.instantiate(withOwner: self, options: nil).first as! UIView
    }
}

class HashCollectionViewCell: UICollectionViewCell {

    var hashTagNib : HashTagNibView?

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    func setup(){
        if let htn = HashTagNibView().loadNib() as? HashTagNibView{
            hashTagNib = htn
            hashTagNib?.frame = self.bounds
            hashTagNib?.autoresizingMask = [.flexibleWidth,.flexibleHeight]
           self.addSubview(htn)
        }

    }

    func configureWithTag(tag:HashTag) {
        if let htn = hashTagNib{
            htn.hashTagButtonLabel.setTitle(tag.word, for: .normal)
        }
    }

Настройка пера будет выглядеть следующим образом: nib

Это может дать вам больше гибкости в зависимости от того, что вы делаете ирезультат аналогичен, за исключением того, что в примере с пером я использовал UIButton.enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...