2015-02-10 91 views
1

我做定制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重新加载。
感谢您的帮助

回答

1

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

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

+0

是的,我解释说,instantitateWithOwner重载编码器初始化 – Hazem 2015-02-10 10:28:55

+0

嗯,这并不能解释为什么你故意创建了这个循环,然后 – 2015-02-10 10:30:06

+0

感谢您的帮助,但没有任何解决方案,以保持xibSetup()在初始化编码器 – Hazem 2015-02-10 10:31:54

4

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

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

如果你不这样做,因为你在每个循环创建一个新的实例,用boolean包装不能工作。 干杯