Бесконечный цикл при создании экземпляра XIB на раскадровке - PullRequest
1 голос
/ 02 июля 2019

Я пытаюсь создать экземпляр xib из раскадровки, но получаю бесконечный цикл. Я видел этот фрагмент, работающий над видео, но, вероятно, я делаю что-то не так. Я могу понять, почему, но не как заставить это работать ... Спасибо за помощь! )

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

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

func setup()
{
    print("INFINITE LOOP :(")

    self.view = self.loadViewFromNib()
    self.view.frame = bounds
    self.addSubview(self.view)

}

func loadViewFromNib() -> UIView
{
    let nib: UINib = UINib(nibName: "ItemView", bundle: .main)
    let view: UIView = nib.instantiate(withOwner: self, options: nil)[0] as! UIView

    return view
}

Ответы [ 3 ]

0 голосов
/ 02 июля 2019

В Интерфейсном Разработчике, где определено ваше представление, вы должны установить для Пользовательского класса Владельца файла значение ItemView (или для других создаваемых вами классов).Не устанавливайте класс просмотра.

К сожалению, StackOverflow не позволяет мне публиковать изображения, но см. Скриншоты ниже.

Просмотр без класса

Файл владельцакласс

0 голосов
/ 02 июля 2019

Найдено! Это может быть полезно для некоторых людей

Я устанавливал класс представления вместо "владельца" файла XIB! Таким образом, XIB создавал представление, которое загружало XIB и так далее ...

Спасибо @RealNmae по ссылке: Как создать пользовательский класс представления iOS и создать несколько его экземпляров (в IB)?

0 голосов
/ 02 июля 2019

Вы не показали достаточно кода, но похоже, что вы действительно делаете это (я упростил ваш код, чтобы сосредоточиться на проблеме):

class ItemView : UIView {
    // called when an ItemView is loaded from a nib
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        loadViewFromNib()
    }
    // called to load an ItemView from a nib
    func loadViewFromNib(){
        let nib: UINib = UINib(nibName: "ItemView", bundle: .main)
        let view: UIView = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
    }
}

Так что, похоже, это представлениеItemView загружается из пера, и при загрузке он пытается загрузить другой ItemView из пера, который пытается загрузить другой ItemView из пера ....

Представление не может загрузить само по себе из пера, как это.Вам нужно поместить весь этот код в класс некоторого другого представления, которое будет действовать как суперпредставление ItemView.

...