从故事板上的xib实例化视图时出现无限循环。

9 浏览
0 Comments

从故事板上的xib实例化视图时出现无限循环。

我正在尝试从故事板实例化一个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
}

admin 更改状态以发布 2023年5月22日
0
0 Comments

你没有展示足够的代码,但是看起来你正在有效地做这件事(我已经简化了你的代码来关注问题):

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

因此,这个视图是从nib中加载的ItemView,并且在加载时它尝试从nib中加载另一个ItemView,然后再尝试从nib中加载另一个ItemView....

一个视图不能像那样从一个nib中加载自己。你需要把所有的代码放在某个其他视图的类中,这个视图将充当ItemView的父视图。

0
0 Comments

在Interface Builder中,您应该设置文件所有者的自定义类为ItemView(或其他您正在创建的类)。不要设置视图类。

不幸的是,StackOverflow不允许我发布图片,但请参见下面的屏幕截图。

没有类的视图

文件所有者的类

0