2016-08-18 85 views
2

假設我不使用故事板。在所有示例中,我看到window應用程序委託中的屬性在willFinishLaunchingWithOptionsdidFinishLaunchingWithOptions中初始化。爲什麼不在對象初始化步驟?我試圖做到這一點,似乎一切工作正常。實現UIApplicationDelegate協議的窗口屬性

更新:更清楚。此代碼是否包含任何隱藏的問題?

class MyAppDelegate: UIResponder, UIApplicationDelegate { 
    var window: UIWindow? = UIWindow(frame: UIScreen.mainScreen().bounds) 

    func application(application: UIApplication, willFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool { 
     window?.rootViewController = UIViewController() //just template to make compile possible 
     window?.makeKeyAndVisible() 
     return true 
    } 
    /* ... */ 
} 
+2

這是iOS的項目模板的蘋果圖案。當然你可以在AppDelegate之外初始化和設置關鍵窗口。而KUDO不使用SB;) –

回答

1

我有基於這個問題的實驗和研究。

首先,讓我們看看蘋果文檔上UIApplicationDelegate的窗口屬性:如果您的應用程序的Info.plist文件包含UIMainStoryboardFile關鍵

這個屬性的實現是必需的。幸運的是,Xcode項目模板通常自動爲應用程序委託包含屬性的合成聲明。此綜合屬性的默認值爲零,這會導致應用程序創建一個通用的UIWindow對象並將其分配給該屬性。如果您想爲應用程序提供自定義窗口,則必須實現此屬性的getter方法並使用它來創建並返回您的自定義窗口。

因此,如果您的代碼不使用Info.plist中的UIMainStoryboardFile選項,則必須自行設置窗口。而且我的實驗顯示窗口屬性根本不被UIApplication調用。 Getter僅在willFinishLaunchingWithOptions方法中調用。據我所知,這種方法沒有隱藏的問題。

如果您想使用UIMainStoryboardFile選項,您可以將窗口創建留給UIApplication。在應用程序的啓動過程中的UIApplication檢查Info.plist中的UIMainStoryboardFile關鍵,如果有故事板提供,它會問AppDelegate中的窗口:

  • 如果窗口是零,UIApplication的一個創造,分配rootViewController它並將其設置AppDelegate中。
  • 如果窗口不爲零,UIApplication的分配rootViewController