使用IBOutlets加载NIB/XIB文件

3
我希望能够从XIB文件加载一个UIView,我已经通过以下方式成功实现了这一功能:

let nib = UINib(nibName: "CardView", bundle: nil).instantiateWithOwner(nil, options: nil).first as! UIView

其中,CardView是我的XIB文件名。现在,当我尝试向XIB文件添加一个IBOutlet时:

enter image description here

我遇到了这个错误:
'NSUnknownKeyException', 原因: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key phraseLabel.
我已经检查了XIB文件中没有孤立的IBOutlets。所以我认为是因为我没有将nib转换为CardView类,所以我尝试了这个: let nib = UINib(nibName: "CardView", bundle: nil).instantiateWithOwner(nil, options: nil).first as! CardView
但是我却遇到了这个错误:
Could not cast value of type 'UIView' (0x10c058df8) to 'LazyFlashCards.CardView' (0x10934bb00).
所以我猜想我实例化XIB文件的方式不正确,但我不知道“正确”的方法是什么。

5
请将最上层视图的类更改为您自己的类,而不是文件所有者的类。 - dan
谢谢,问题已解决!因此,文件所有者是一个类,它是稍后加载文件的类的“代理”,所以我之前出现错误的原因是我的视图控制器没有一个名为phraseLabel的IBOutlet。如果这样的话,那么文件所有者的目的是什么,如果它最终会被实例化NIB的类取代呢? - YellowPillow
如果是这样,那么如果它将被实例化NIB的类替换,文件所有者的目的是什么?好吧,那么您不了解nib加载吗?阅读我的书可能会对您有所帮助:http://www.apeth.com/iOSBook/ch07.html#_nib_loading_and_file_8217_s_owner - matt
除了@dan的观点之外:如果你在改变文件的拥有者和顶级视图之前已经创建了插座,那么你需要在更改后重新创建它们。 - Paul
2个回答

0
如果你在测试中遇到了这个问题,那么你需要将所有者设置为测试目标。
bundle.loadNibNamed("myNib", owner: testSubject) // owner != nil

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接