从情节提要上的Xib实例化视图进行无限循环

时间:2019-07-01 23:17:46

标签: ios swift xib

我正在尝试从情节提要中实例化xib,但是却遇到了无限循环。我已经看到了这段视频片段,但是我可能做错了。我能理解为什么,但是不知道如何使它起作用... Tx寻求帮助! )

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 :(得分:0)

您没有显示足够的代码,但看来您正在有效地执行此操作(我已简化了代码以专注于该问题):

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。...

视图无法从这样的笔尖加载本身。您需要将所有代码放在某些 other 视图的类中,该视图将充当ItemView的超级视图。

答案 1 :(得分:0)

在Interface Builder中,在其中定义了视图的情况下,应将 File Owner's 的自定义类设置为ItemView(或正在创建的其他类)。不要设置视图类。

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

View with no class

File owner's class

答案 2 :(得分:0)

找到了!这对某些人可能会有帮助

我正在设置视图类,而不是xib文件的“所有者”!所以xib正在创建加载xib的视图,依此类推...

通过链接上的@RealNmae: How do I create a custom iOS view class and instantiate multiple copies of it (in IB)?