2014-08-28 89 views
22

我讀過Using XCode storyboard to instantiate view controller that uses XIB for its design,但我在Swift(使用Xcode 6 Beta 6)中遇到麻煩。我想知道我是否做錯了什麼,或者如果這個功能不再可用?無法在Swift中的Storyboard中加載UIViewController XIB文件

我創建了一個簡單的存儲庫,https://github.com/jer-k/StoryboardTesting-Swift,展示了上述方法。

我設法通過增加來解決這個問題,並覆蓋到初始化

required init(coder aDecoder: NSCoder) { 
    super.init(nibName: "TestViewController", bundle: NSBundle.mainBundle()) 
} 

但我想知道如果它仍然可能有故事板處理這對我來說。創建一個超類讓所有的UIViewControllers繼承上述代碼並不是世界上最麻煩的事情,但我只是對此感到好奇。

+0

我想知道什麼時候有人會問這個問題... :) – matt 2014-08-28 00:38:15

+0

http://stackoverflow.com/questions/27151026/無法編程地創建一個uiviewcontroller在迅速/ 35888118#35888118 – 2016-03-09 10:03:09

回答

39

發生了什麼事是Seed 5打破了視圖控制器可以通過名稱找到它的xib的機制,如果視圖控制器是Swift類的話。原因是在Swift的腦海裏,這個類的名字與你給它的名字(和你給xib文件的名字)不一樣。該名稱已被「破壞」,特別是通過預先添加模塊名稱(即Swift類具有名稱空間)。

我提供三種解決方法:

  • 你的解決方法是一個很好的

  • 名稱的.xib文件(按名稱顯式加載的.xib文件)MyModule.TestViewController.xib,其中MyModule是你的包的名稱(即項目名稱)(這是蘋果的建議,但我討厭它)

  • 使用@objc(TestViewController) bef礦石視圖控制器的class聲明克服名字改編這是什麼破機制(這是我喜歡的方式)

看到這裏我的討論:https://stackoverflow.com/a/25163757/341994和我進一步討論掛在那裏:https://stackoverflow.com/a/25152545/341994

編輯此錯誤在iOS 9 beta 4中得到修復。如果nib文件搜索失敗,則iOS 9現在將模塊名稱從視圖控制器類名剝離並再次執行nib文件搜索。

+0

我有一些輕微的希望,蘋果將通過解決這個問題來回應我的錯誤報告,但事實上,他們用我的錯誤「令人沮喪。 – matt 2014-08-28 00:39:29

+0

我看到你的討論第二個鏈接的答案,我明白了。是否記錄過我們需要開始將模塊名稱預先添加到xibs中?也許我錯過了它。無論哪種方式,令人敬畏的工作。我現在要使用@objc方法,因爲如果他們決定放棄對前置模塊名稱的需求,它將很容易刪除。如果我們退出測試版,並且最終確定我們必須預先輸入模塊名稱,因爲這是他們建議的方法,但現在我喜歡您的解決方案。 – TheJer 2014-08-28 00:45:45

+1

需要補充說明的是:我不得不回到故事板並重新設置名稱來拾取未損壞的版本,但它的作用就像一個魅力。 – TheJer 2014-08-28 00:59:10

2

另一個答案是:

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上,誰知道......))

+0

第二個答案適用於我。現在我可以用iOS8模擬器進行測試 – iWheelBuy 2016-05-25 04:33:23