2012-05-01 462 views

回答

73

在故事板項目UIWindow可以被繼承,如蘋果公司的UIApplicationDelegate參考解釋:

窗口
當正在使用的故事板,應用程序必須通過將其添加到窗口呈現 故事板並在屏幕上放置該窗口。 應用程序查詢該屬性的窗口。保留 通過此屬性對窗口的引用對於保持 窗口不被釋放是必要的。如果該屬性的值爲nil(默認爲 ),那麼應用程序將創建一個通用實例UIWindow和 將其分配給此屬性以供委託參考。您可能會使用此協議的getter方法爲 應用程序提供不同的窗口。

換句話說你AppDelegate實現簡單的添加下面的getter

Objective-C的

- (MyCustomWindow *)window 
{  
    static MyCustomWindow *customWindow = nil; 
    if (!customWindow) customWindow = [[MyCustomWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    return customWindow; 
} 

斯威夫特

var customWindow: MyCustomWindow?  
var window: UIWindow? { 
    get { 
     customWindow = customWindow ?? MyCustomWindow(frame: UIScreen.mainScreen().bounds) 
     return customWindow 
    } 
    set { } 
} 
+0

你能提供一下我怎樣在Swift中重寫getter嗎? –

+1

我用Swift代碼更新了答案 –

+0

非常感謝。它工作正常。我沒有爲此創建setter,以至於我得到錯誤。 –

1

在我自己的應用程序中,當從Xcode模板創建新應用程序時,我在AppDelegate.h中看到了「window」屬性。

您可以修改該屬性以在此時從「UIWindow」更改爲「MyWindow」。

或者,不太優雅的解決方案,您可以在訪問它時簡單地將window返回到「MyWindow」對象類型。

+1

那些都將導致'MyWindow'獲得創建 - 他們只是錯投了已經存在的'UIWindow'到'爲mywindow '。 –

+0

@NoahWitherspoon - vfxdomain現在可能已經知道如何創建一個MyWindow(因爲他提到[這個相關的問題](http://stackoverflow.com/questions/7883886/where-can-i-change-the-window-my -app-uses-from-uiwindow-to-my-own-subclass-mywi)在他的帖子裏)。我認爲他的問題是他想知道如何通過「window'」屬性的getter方法返回MyWindow。 –

+0

@Michael Dautermann - 是的,這就是我所要求的...Noah Witherspoon指出,在App Delegate中將UIWindow更改爲myWindow將不起作用。 – izaslavs

0

它不是那麼難,你」重新去第一子類的UIWindow

class WinCustom : UIWindow{ 
.... 
} 

然後在AppDelegate中:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    self.window = WinCustom(frame: UIScreen.main.bounds) 

    self.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() 

    return true 
}