Быстрое создание Custom View из Nib - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь реализовать Custom Loader View с файлом Nib. Но я получаю ошибку в loadViewFromNib() в

return nib.instantiate(withOwner: self, options: nil).first as? UIView.

Тема 1: EXC_BAD_ACCESS (код = 2, адрес = 0x7ffee6f3df98)

open class LoaderView: UIView {

@IBOutlet var loaderImage: UIImageView!    
@IBOutlet var contentView: UIView!

func xibSetup() {
    contentView = loadViewFromNib()
    contentView.frame = bounds
    contentView.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]
    addSubview(contentView)
}

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

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

func loadViewFromNib() -> UIView? {
    let bundle = Bundle(for: type(of: self))
    let nib = UINib(nibName: "LoaderView", bundle: bundle)
    return nib.instantiate(withOwner: self, options: nil).first as? UIView
}
}

Я называю этот загрузчик в VC в viewDidLoad() как

let loader = LoaderView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
view.addSubview(loader)

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Ваш код в порядке, нет рекурсии

Пожалуйста, убедитесь, что у вас есть

1) Дважды проверьте подключение IBOUtlet

2) Добавлен Ваш класс в Владелец файла


enter image description here

enter image description here

Я создал это так же, как ваш код

class CustomView: UIView {

    let nibName = "CustomView"
    @IBOutlet var view : UIView!

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

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

    func xibSetUp() {
        view = loadViewFromNib()
        view.frame = self.bounds
        view.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]
        addSubview(view)
    }

    func loadViewFromNib() -> UIView {

        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: "CustomView", bundle: bundle)
        return nib.instantiate(withOwner: self, options: nil).first as! UIView

    }

}

Посмотрите на вывод

enter image description here

0 голосов
/ 05 июля 2018

У вас есть рекурсия в

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

Вы звоните loadViewFromNib() в xibSetup(), звоните UINib(nibName: "LoaderView", bundle: bundle), звоните required public init?(coder aDecoder: NSCoder)

developer.apple.com

...