【问题标题】:Loading a NIB/XIB file with IBOutlets使用 IBOutlets 加载 NIB/XIB 文件
【发布时间】:2017-01-08 15:37:22
【问题描述】:

我想从 XIB 文件中加载 UIView,我可以通过以下方式成功地做到这一点:

让 nib = UINib(nibName: "CardView", bundle: nil).instantiateWithOwner(nil, options: nil).first as!界面视图

CardView 是我的 XIB 文件的名称。现在,当我尝试将 IBOutlet 添加到 XIB 文件时:

我收到此错误:

'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: 这个类不符合 keyphraseLabel 的键值编码。

我检查了 XIB 文件中没有任何孤立的 IBOutlets。所以认为这是因为我没有将nib 转换为CardView 类我尝试了这个:

让 nib = UINib(nibName: "CardView", bundle: nil).instantiateWithOwner(nil, options: nil).first as!卡片视图

但我最终得到了这个错误:

无法将“UIView”(0x10c058df8) 类型的值转换为“LazyFlashCards.CardView”(0x10934bb00)。

所以我猜我错误地实例化了 XIB 文件,但我不知道“正确”的方法

【问题讨论】:

  • 您需要将顶级视图的类更改为您的类,而不是文件的所有者
  • 感谢修复!所以文件的所有者是稍后加载文件的类的“代理”类,所以我收到错误的原因是因为我的视图控制器没有名为phraseLabel的IBOutlet。它是否正确?如果是这样,那么如果文件所有者将被实例化 NIB 的类所取代,那么文件所有者的目的是什么?
  • "如果是这样,那么如果文件所有者将被实例化 NIB 的类所取代,那么文件所有者的目的是什么" 好吧,所以你不了解 nib 加载?可能会帮助您阅读我的书:apeth.com/iOSBook/ch07.html#_nib_loading_and_file_8217_s_owner
  • 除了@dan 的观点:如果您在更改文件的所有者和顶级视图之前已经创建了出口,那么您需要在更改后重新创建它们。跨度>

标签: ios swift xcode uiview xib


【解决方案1】:

如果您在测试中遇到此问题,您需要将所有者设置为您的测试目标。

bundle.loadNibNamed("myNib", owner: testSubject) // owner != nil

【讨论】:

    【解决方案2】:

    我刚刚写了一个例子,通过swift从XIB加载uiview,你可以阅读,希望对你有帮助!

    https://github.com/lengocgiang/loadViewFromXib

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 2019-04-20
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多