调用instantiateWithOwner后,UIView的init编码器重新加载

时间:2015-02-10 10:17:38

标签: ios xcode swift uiview

我在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 谢谢你的帮助

2 个答案:

答案 0 :(得分:4)

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

Carefull,你的xib类(故事板层次结构中的“视图”)必须是UIView而不是CustomView

如果不执行此操作,则使用布尔值的换行不起作用,因为您在每个循环中创建了一个新实例。 干杯

答案 1 :(得分:1)

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

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