【问题标题】:Infinite loop on instantiated view from xib on storyboard从情节提要上的xib实例化视图上的无限循环
【发布时间】:2019-11-12 13:46:30
【问题描述】:

我正在尝试从情节提要中实例化一个 xib,但我得到了一个无限循环。我已经看到这个 sn-p 正在处理视频,但我可能做错了什么。我可以理解为什么,但不知道如何使它工作...... Txs寻求帮助! )

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
}

【问题讨论】:

  • 这段代码在哪个类? view 声明为什么类? ItemView 设置在笔尖中的是什么类?
  • 看来 loadViewFromNib 会再次调用 init。
  • 这是我的类 ItemView: UIView
  • 看起来您的视图正在尝试从笔尖加载自身。因此循环。

标签: ios swift xib


【解决方案1】:

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

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

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

【讨论】:

  • 这正是我的回答所说的。你加载的视图的类不能是这个视图的类,否则我们会得到一个循环。关于文件所有者的东西是无关紧要的。
【解决方案2】:

在定义视图的界面生成器上,您应该将文件所有者的自定义类设置为ItemView(或您正在创建的其他类)。不要设置视图类。

很遗憾,StackOverflow 不允许我发布图片,但请查看下面的屏幕截图。

View with no class

File owner's class

【讨论】:

  • 没错!非常感谢!
  • 这是误导。在这种情况下,文件所有者的类是无关紧要的。
  • 文件的所有者引用了出口并接收操作。通常,它与视图不同的类/实例(即视图控制器及其对应的视图)。但是uncommon 不适合以这种方式构建自定义视图。
【解决方案3】:

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

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

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

【讨论】:

  • 是的 nib.instantiate() 调用 init 调用 loadViewFromNib() 等...我通过代码创建视图时没有问题。
  • 那么在使用storyboard的时候,正确的实现方式是什么?
  • 我不知道你想做什么。我只能解释为什么这种方式是循环的。
  • 我只想从情节提要中实例化这个确切的自定义视图(在情节提要上拖动一个 uiview 并将其类设为“ItemView”)...我是新来的,请原谅我只是在Android 开发者 :)
  • 但是这个精确的自定义视图已经在 nib(一个 .xib 文件)中配置了。将它粘贴在情节提要中然后说您希望它来自笔尖是没有意义的。选择一个。
猜你喜欢
  • 2012-08-15
  • 2015-04-14
  • 2015-12-29
  • 2013-11-10
  • 2017-06-18
  • 2012-12-18
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多