2017-05-05 77 views
-3

我收到的錯誤:如何解決錯誤「類的appDelegate沒有初始化」

Class AppDelegate has no initializers

,似乎無法理解爲什麼。我正在關注this tutorial。我是初學者,所以任何幫助將非常感激!

我的代碼:

import UIKit 

@UIApplicationMain 

class AppDelegate: UIResponder, UIApplicationDelegate { 
    var window: UIWindow? 
    var centerContainer: MMDrawerController 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     // Override point for customization after application launch. 

     _ = self.window!.rootViewController 

     let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 

     let centerViewController = mainStoryboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController 

     let leftViewController = mainStoryboard.instantiateViewController(withIdentifier: "LeftSideViewController") as! LeftSideViewController 

     let leftSideNav = UINavigationController(rootViewController: leftViewController) 
     let centerNav = UINavigationController(rootViewController: centerViewController) 


     centerContainer = MMDrawerController(center: centerNav, leftDrawerViewController: leftSideNav) 


     centerContainer.openDrawerGestureModeMask = MMOpenDrawerGestureMode.panningCenterView; 

     centerContainer.closeDrawerGestureModeMask = MMCloseDrawerGestureMode.panningCenterView; 

     window!.rootViewController = centerContainer 
     window!.makeKeyAndVisible() 

     return true 
    } 
} 
+0

'centerContainer'是否需要屬性?除了'didFinishLaunchingWithOptions'方法之外,還會從其他代碼訪問嗎? – rmaddy

+2

[Class沒有初始化器Swift]可能的重複(http://stackoverflow.com/questions/27797351/class-has-no-initializers-swift) –

回答

0

試着改變你的centerContainer屬性的可選這樣的:

var centerContainer: MMDrawerController! 

因爲如此,它將被nil初始化,這應該是足夠的刪除你遇到的錯誤。 (順便說一句,你不應該需要改變你的代碼的其餘部分作爲一個結果。)

The Swift Programming Language書:

Classes and structures must set all of their stored properties to an appropriate initial value by the time an instance of that class or structure is created. Stored properties cannot be left in an indeterminate state.

+0

謝謝,這是非常有幫助的! – Acer

+0

@Acer歡迎您!順便說一句,歡迎來到:) –

2

由於centerContainer不是可選的,並且沒有給出默認值,Swift需要一個初始化函數來給它一個。這裏有幾種可能的解決方案:

  1. 給它一個默認值。在這種情況下可能不實用。
  2. 使其成爲可選項。可以工作,但取決於它的使用方式可能會增加很多不必要的解開代碼。
  3. 使其隱式解包可選。這實際上是說「我不能/不希望給這個默認值或者將它設置在初始化器中,但是在我將它用於任何事情之前,我肯定會給它一個值。」通常這樣的事情最乾淨的選擇,只是要小心,你不會在你的代碼的任何一點分配它nil或事情會中斷。
0

讓你的centerContainer var可選像window。在swift中,所有的屬性都必須初始化。當你讓你的var可選時,你將它初始化爲nil

var centerContainer: MMDrawerController? 
+0

在這裏使用*隱式解包*可選(即'MMDrawerController!')可能更適合這裏。請參閱下面的答案。 –

+0

@PauloMattos是的!這是絕對正確的。但是,由於OP對'可選'有一些基本的知識(他曾使用過'window'),所以我希望不要吹噓一些更多的概念_(也就是'implicit optional')對他有好處。 – nayem

+1

好點的男人,我同意! A *概念過載* - 有人可能會說SO上的共同行爲 - 可能會嚇跑他。有時你需要在時間學習一個技巧:) –

相關問題