如果我 运行 iOS8 模拟器上的应用程序,则不会初始化来自 xib 的 IBOutlets
IBOutlets from xib are not initialised if I run an app on iOS8 Simulator
我已经使用 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")
}
出现错误
fatal error: unexpectedly found nil while unwrapping an Optional value
因为 collectionView 为 nil:
当然,我已经仔细检查了 IB 中的连接是否已建立:
谁能告诉我为什么这里的 collectionView 为 nil?
我可以通过添加
来解决这个问题
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
let name = NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!
super.init(nibName: nibNameOrNil ?? name, bundle: nibBundleOrNil)
}
到视图控制器class。但为什么会这样呢?还有其他方法可以解决此问题吗?
更新:
这是一个非常类似于错误的 Swift 视图控制器功能。检查 Can't Load UIViewController XIB file in Storyboard in Swift and Are view controllers with nib files broken in ios 8 beta 5?
它已在 iOS 9.4 中修复,但如果您需要 iOS 8 和更早版本的支持,您仍然需要使用变通方法。
你是如何实例化你的视图控制器的?
通过 viewController = MyViewController()
实例化将在访问 IBOutlets
时在 iOS8.x 中崩溃(尽管它在 iOS9.3 中工作正常,并且大概在 iOS9.x 中)
无论 iOS.
的版本如何,使用 viewController = MyViewController(nibName: "MyViewController", bundle: nil)
实例化视图控制器都应该有效
请参阅其他帖子以供参考:All my IBOutlet are nil in viewDidLoad
Matt Neuburg 的书 Programming iOS8 中强调了这个问题。发生这种情况是因为 iOS 8 期望 xib 名称以模块名称为前缀,在这种情况下,模块名称与项目名称相同。例如,如果你的项目 MyProject
中有 MyViewController
,它会期望找到名为 MyProject.MyViewController.xib
的 xib。要解决此问题,请在视图控制器中覆盖 nibName
:
override var nibName: String? {
return "\(self.dynamicType)"
}
我已经使用 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")
}
出现错误
fatal error: unexpectedly found nil while unwrapping an Optional value
因为 collectionView 为 nil:
当然,我已经仔细检查了 IB 中的连接是否已建立:
谁能告诉我为什么这里的 collectionView 为 nil?
我可以通过添加
来解决这个问题override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
let name = NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!
super.init(nibName: nibNameOrNil ?? name, bundle: nibBundleOrNil)
}
到视图控制器class。但为什么会这样呢?还有其他方法可以解决此问题吗?
更新: 这是一个非常类似于错误的 Swift 视图控制器功能。检查 Can't Load UIViewController XIB file in Storyboard in Swift and Are view controllers with nib files broken in ios 8 beta 5?
它已在 iOS 9.4 中修复,但如果您需要 iOS 8 和更早版本的支持,您仍然需要使用变通方法。
你是如何实例化你的视图控制器的?
通过 viewController = MyViewController()
实例化将在访问 IBOutlets
时在 iOS8.x 中崩溃(尽管它在 iOS9.3 中工作正常,并且大概在 iOS9.x 中)
无论 iOS.
的版本如何,使用viewController = MyViewController(nibName: "MyViewController", bundle: nil)
实例化视图控制器都应该有效
请参阅其他帖子以供参考:All my IBOutlet are nil in viewDidLoad
Matt Neuburg 的书 Programming iOS8 中强调了这个问题。发生这种情况是因为 iOS 8 期望 xib 名称以模块名称为前缀,在这种情况下,模块名称与项目名称相同。例如,如果你的项目 MyProject
中有 MyViewController
,它会期望找到名为 MyProject.MyViewController.xib
的 xib。要解决此问题,请在视图控制器中覆盖 nibName
:
override var nibName: String? {
return "\(self.dynamicType)"
}