切换到 Xcode 6 Beta 5 后,所有 IBOutlets 都变为 nil

Posted

技术标签:

【中文标题】切换到 Xcode 6 Beta 5 后,所有 IBOutlets 都变为 nil【英文标题】:All IBOutlets become nil after switching to Xcode 6 Beta 5 【发布时间】:2014-08-06 01:35:59 【问题描述】:

例如,视图控制器中有一个属性

@IBOutlet weak var nameLabel: UILabel!

此属性在viewWillAppearviewDidLoad 内是nil,因此应用程序在运行时崩溃。

它在 Xcode 6 Beta 4 中运行良好。在我切换到 Beta 5 后,它抱怨控制器类 does not implement its superclass's required members。所以我加了

required init(coder aDecoder: NSCoder!) 
  super.init(coder: aDecoder)

那个编译器错误消失了。但是,unexpectedly found nil while unwrapping an Optional value 的应用程序崩溃,因为当我尝试设置其 text 时,nameLabel 属性是 nil

我通读了发行说明,但不知道如何解决此问题。

【问题讨论】:

Same here 现在我发现这不仅是我的问题,而且我不相信苹果提交的 Beta5 有这么大的错误...... 是你的控制器UICollectionViewController 不,我的是UIViewController的子类 我在使用 Beta 5 时遇到了所有奇怪的问题。我想我会恢复到 Beta 4 并等待 Beta 6 Apple 有人告诉我解决方法。请参阅下面的修改后的答案。 【参考方案1】:

我在 Beta5 中遇到了同样的问题。这似乎是一个问题,

init(nibName: nil, bundle: nil) 

没有将 nil 映射到默认的 nibName。当我更改为显式 nibName 时,它​​就起作用了。特别是在我的情况下,使用新的 ??运营商:

override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) 
   // beta5 workaround: replace nil with explicit name of xib file
   let nib = nibNameOrNil ?? "MyViewController"

   super.init(nibName: nib, bundle: nibBundleOrNil)

   // local initialization here

让它再次神奇地工作。

【讨论】:

这是一个很好的解决方法,因为 (1) 它将责任放在视图控制器本身的肩上,(2) 它使用了很酷的新 ?? 运算符。 :) 呃,我花了太多时间与编译器作斗争,然后对这次崩溃感到困惑。谢谢。 此错误已在 ios 9 beta 4 中修复,因此无需使用此解决方法。【参考方案2】:

这是一个临时错误。解决方法是:以覆盖名称修饰的方式声明您的视图控制器,如下所示:

@objc(ViewController) ViewController : UIViewController  // or whatever its name is

另请参阅:Are view controllers with nib files broken in ios 8 beta 5?

编辑此错误已在 iOS 9 beta 4 中修复。

【讨论】:

以上是关于切换到 Xcode 6 Beta 5 后,所有 IBOutlets 都变为 nil的主要内容,如果未能解决你的问题,请参考以下文章

将 Xcode 6 beta 6 更新到 beta 7 后出现“可选错误”

将 xcode 6 beta 6 升级到 xcode 6 GM 种子后的 Swift 编译器错误

更新到 Xcode 7 Beta 5 并收到此错误:失败,退出代码 6

使用 Xcode6-Beta 运行 Xcode 5.1.1 项目

安装 XCode 6 beta 4 后无法运行旧的 swift 项目

如何发送在 Xcode 5 上创建但已迁移到 Xcode 6 的 Apple Beta 测试项目?