[英]UIViewController defined in a xib file doesn't load in the storyboard
[英]Can't Load UIViewController XIB file in Storyboard in Swift
我已經閱讀了使用XCode故事板來實例化使用XIB進行設計的視圖控制器,但是我在使用Swift(使用Xcode 6 Beta 6)時遇到了麻煩。 我想知道我做錯了什么或者這個功能不再可用了嗎?
我創建了一個簡單的存儲庫, https://github.com/jer-k/StoryboardTesting-Swift ,它展示了上述方法。
我設法通過添加和覆蓋init來解決問題
required init(coder aDecoder: NSCoder) {
super.init(nibName: "TestViewController", bundle: NSBundle.mainBundle())
}
但我想知道是否仍有可能讓故事板為我處理這個問題。 創建一個超類讓我的所有UIViewControllers繼承上面的代碼並不是世界上最麻煩的東西,但我只是好奇。
發生了什么事情,如果視圖控制器是一個Swift類,種子5破壞了視圖控制器可以通過名稱找到其xib的機制。 原因是,在Swift的腦海中,類的名稱與您給它的名稱(以及您給出的xib文件的名稱)不同; 該名稱已被“修改”,特別是通過預先添加模塊名稱(即Swift類具有命名空間)。
我提供了三種解決方法:
您的解決方法很好(明確地按名稱加載.xib文件)
將.xib文件命名為MyModule.TestViewController.xib ,其中MyModule
是捆綁包的名稱(即項目名稱)(這是Apple建議的,但我討厭它)
在視圖控制器的class
聲明之前使用@objc(TestViewController)
來克服名稱錯誤,這是破壞機制的原因(這是我贊成的方法)
請參閱我在此處的討論: https : //stackoverflow.com/a/25163757/341994以及我從那里鏈接的進一步討論: https : //stackoverflow.com/a/25152545/341994
編輯此錯誤在iOS 9 beta 4中得到修復。如果nib文件搜索失敗,iOS 9現在會從視圖控制器類名中刪除模塊名稱,並再次執行nib文件搜索。
另一個答案是:
override func loadView() {
if #available(iOS 9, *) {
super.loadView()
} else {
let classString = String(self.dynamicType)
NSBundle.mainBundle().loadNibNamed(classString, owner: self, options: nil)
}
}
鏈接: http : //japko.net/2014/09/08/loading-swift-uiviewcontroller-from-xib-in-storyboard/
編輯:
override var nibName: String? {
get {
let classString = String(self.dynamicType)
return classString
}
}
override var nibBundle: NSBundle? {
get {
return NSBundle.mainBundle()
}
}
這看起來更漂亮。 適用於iOS 8/9(也許在iOS 7上,誰知道...))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.