UIView的init编码器在调用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重新加载
感谢您对的帮助

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

请注意,xib的类(故事板层次结构中的"视图")必须是UIView,而不是CustomView

如果不这样做,则使用布尔值的包装将无法工作,因为您在每个循环中都创建了一个新实例。干杯

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

这就是为什么你得到了无限循环。您可以从init方法中删除XibSetup来停止循环。

最新更新