我在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来停止循环。