来自故事板上 xib 的实例化视图的无限循环

Infinite loop on instantiated view from xib on storyboard

我正在尝试从情节提要中实例化一个 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
}

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

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

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

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

不幸的是,Whosebug 不允许我 post 图片,但请参阅下面的屏幕截图。

View with no class

File owner's class

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

我正在设置视图 class 而不是 xib 文件的 "owner"!所以 xib 正在创建加载 xib 的视图等等...

感谢 link 上的@RealNmae: How do I create a custom iOS view class and instantiate multiple copies of it (in IB)?