簡體   English   中英

無法在Swift的Storyboard中加載UIViewController XIB文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM