【问题标题】:IBOutlets from xib are not initialised if I run an app on iOS8 Simulator如果我在 iOS8 模拟器上运行应用程序,则不会初始化来自 xib 的 IBOutlets
【发布时间】:2015-09-17 14:07:41
【问题描述】:

我已经使用 XCode 7 GM(基础 SDK - iOS9)构建了一个应用程序。如果我在 iOS 9 模拟器上运行它可以完美运行,但如果我尝试在 iOS8 上运行它会失败:

@IBOutlet weak var collectionView: UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()
    navigationItem.title = NSLocalizedString("Home", comment: "Home")
    collectionView.registerNib(UINib(nibName: "PTHomeCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "PTHomeCollectionViewCell")
}

有错误

致命错误:在展开可选值时意外发现 nil

因为 collectionView 是 nil:

当然,我已经检查了 IB 中的连接是否已建立:

谁能告诉我为什么collectionView在这里是零?

【问题讨论】:

  • 意外发现 nil 类型的错误大多在您清理并再次运行应用程序时解决。
  • 谢谢,但没有帮助

标签: ios interface-builder ios-simulator swift2


【解决方案1】:

我可以通过添加来解决这个问题

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    let name = NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!
    super.init(nibName: nibNameOrNil ?? name, bundle: nibBundleOrNil)
}

到视图控制器类。但是为什么它会这样工作呢?有没有其他方法可以解决这个问题?

更新: 它是一个 Swift 视图控制器功能,与 bug 非常相似。检查Can't Load UIViewController XIB file in Storyboard in SwiftAre view controllers with nib files broken in ios 8 beta 5?

它在 iOS 9.4 中已修复,但如果您需要 iOS 8 及更早版本的支持,您仍需要使用变通方法。

【讨论】:

    【解决方案2】:

    Matt Neuburg 的iOS 8 编程一书中强调了这个问题。发生这种情况是因为 iOS 8 期望 xib 名称以模块名称为前缀,在这种情况下与项目名称相同。例如,如果您的项目MyProject 中有MyViewController,它将期望找到名为MyProject.MyViewController.xib 的xib。要解决此问题,请在视图控制器中覆盖 nibName

    override var nibName: String? { 
        return "\(self.dynamicType)"
    }
    

    【讨论】:

    • 但是如果我不想在我所有的 xib 前面加上模块名称,它会起作用吗?
    • 是的。正如我所展示的,只需覆盖nibName,一切都会好起来的。
    【解决方案3】:

    你是如何实例化你的视图控制器的?

    通过viewController = MyViewController() 实例化在访问IBOutlets 时会在iOS8.x 中崩溃(尽管它在iOS9.3 中可以正常工作,并且可能在iOS9.x 中)

    无论 iOS 版本如何,使用 viewController = MyViewController(nibName: "MyViewController", bundle: nil) 实例化视图控制器都应该可以工作。

    请参阅此其他帖子以供参考:All my IBOutlet are nil in viewDidLoad

    【讨论】:

      猜你喜欢
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 2021-12-15
      • 2016-08-20
      • 1970-01-01
      • 2011-11-10
      • 2016-09-29
      相关资源
      最近更新 更多