使用故事板时子类化UIWindow

时间:2012-05-01 19:31:17

标签: iphone objective-c ios cocoa-touch uiwindow

我遇到与此问题中解释的相同的问题:

Where can I change the window my app uses from UIWindow to my own subclass "MyWindow" with storyboard?

我的问题是如何在我的app委托中实现一个'window'getter方法,返回'MyWindow'子类?或者也许有其他方法可以将我的子类分配到我的应用程序的主窗口?

4 个答案:

答案 0 :(得分:75)

如在Apple的UIWindow参考中所述,Storyboard项目中的

UIApplicationDelegate可以进行子类化:

  

窗口
  在使用故事板时,应用程序必须显示   故事板通过将其添加到窗口并将该窗口放在屏幕上。   应用程序在窗口中查询此属性。保留   这个属性引用窗口是必要的,以保持   窗口被释放。如果属性的值是nil(   默认情况下,应用程序创建UIWindow的通用实例   将其分配给此属性以供委托引用。你可以   实现此协议的getter方法来提供   应用程序使用不同的窗口。

换句话说,在AppDelegate实现中,只需添加以下getter

即可

<强>目标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 { }
}

答案 1 :(得分:1)

在我自己的应用程序中,我在从Xcode模板创建新应用程序时看到了在AppDelegate.h中声明的“window”属性。

您可以修改该属性,以便在此时从“UIWindow”更改为“MyWindow”。

或者,不太优雅的解决方案,您可以在访问时简单地将window转换为“MyWindow”对象类型。

答案 2 :(得分:1)

你并没有那么努力去第一个子类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
}

答案 3 :(得分:0)

UIApplicationDelegate协议具有window属性,您可以使用

import UIKit

class CustomWindow : UIWindow {
    //...
}
class AppDelegate: UIResponder, UIApplicationDelegate {

    var customWindow: CustomWindow?

    var window: UIWindow? {
        get {
            customWindow = customWindow ?? CustomWindow(frame: UIScreen.main.bounds)
            return customWindow
        }
        set { }
    }

    //...
}

此解决方案仅返回自定义UIWindow

[Set UIWindow]