UIView 的初始化编码器在调用 instantiateWithOwner 后重新加载

init coder of UIView reload after call instantiateWithOwner

我在 swift 中自定义了 uiview,这是代码

@IBDesignable public class HomeScreenCodeView: UIView {


    var view :UIView!



    var nibName : String = "HomeScreenView"



    override init(frame: CGRect) {
        // 1. setup any properties here

        // 2. call super.init(frame:)
        super.init(frame: frame)

        // 3. Setup view from .xib file
        xibSetup()
    }

    required public init(coder aDecoder: NSCoder) {
        // 1. setup any properties here

        // 2. call super.init(coder:)
        super.init(coder: aDecoder)

        // 3. Setup view from .xib file
        xibSetup()
    }

    func xibSetup() {
        view = loadViewFromNib()


        view.frame = bounds


        view.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight


        addSubview(view)
    }

    func loadViewFromNib() -> UIView {
        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: nibName , bundle: bundle)

        // Assumes UIView is top level and only object in CustomView.xib file
        let view = nib.instantiateWithOwner(self, options: nil)[0] as UIView
        return view
    }

问题出在调用时let view = nib.instantiateWithOwner(self, options: nil)[0] as UIView

init coder召回和xibSetup()召回,这导致无限循环。
如何解决这个问题并阻止init重新加载。
感谢您的帮助

instantitateWithOwner 加载一个 nib/xib 文件,该文件又调用 init(coder aDecoder: NSCoder)。 (来源:Apple documentation

这就是你得到那个无限循环的原因。您可以从 init 方法中删除 XibSetup 以停止循环。

为了避免无限循环,您必须从 CustomView 进入 XIB,并将文件所有者关联到您的 customView swift Class。

小心,你 xib 的 class(故事板层次结构中的 "View")必须是 UIView 而不是 CustomView

如果你不这样做,布尔值换行将无法工作,因为你在每个循环中创建了一个新实例。 干杯