2015-11-29 62 views
2

我想将我准备好的UIView(位于xib文件中)嵌入到故事板中。带编码器的UIView初始化导致递归

什么我迄今所做的是:

class TestUIView : UIView { 
    @IBOutlet weak private var firstButton: UIButton! 
    @IBOutlet weak private var secondButton: UIButton! 

    // MARK - Lifetime 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 

     let view = NSBundle.mainBundle().loadNibNamed("TestUIView", owner: self, options: nil).first as! TestUIView 

     self.addSubview(view) 
    } 
} 

但出于某种原因,我得到坏存取存储器例外。 从查看堆栈跟踪我看到了一堆调用initWithCoder http://i.stack.imgur.com/iH6Am.png 我不知道为什么NSBundle.mainBundle()。loadNibNamed导致此,任何想法?

+0

大概nib文件包含一个'TestUIView'的实例,所以当'loadNibNames'加载nib时,它会通过调用'init(coder)'实例化一个'TestUIView'实例,加载该nib等等,直到递归导致堆栈爆炸。你为什么在'init(coder)'中加载nib? – Paulw11

回答

6

回合的什么我做错了是怎么准备的.xib文件,我已经设置视图本身,而不是文件所有者TestUIView类。 更改文件所有者(并重置约束)后,一切正常。

+0

将你的答案标记为已解决,这样可以帮助其他人:) –

+0

花了我几乎两个小时...... –

0

您刚才定义的方式来建立一个TestUIView包含TestUIView包含TestUIView包含TestUIView ...

你不必调用

let view = NSBundle.mainBundle().loadNibNamed("TestUIView", owner: self, options: nil).first as! TestUIView 

init?(coder aDecoder: NSCoder) 

这样你就创建了一个无限循环,因为loadNibNamed会自动调用init?(coder aDecoder: NSCoder)

就删除这些行

let view = NSBundle.mainBundle().loadNibNamed("TestUIView", owner: self, options: nil).first as! TestUIView 
self.addSubview(view) 
+0

但是,如何将笔尖连接到班级? 删除这些类别后,我的店铺未设置。 –

+0

顺便说一句,这是我从这个想法:http://iphonedev.tv/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file- in-xcode-6 –

相关问题