31

我有与这个问题中解释的相同的问题:

在哪里可以将我的应用程序使用的窗口从 UIWindow 更改为我自己的带有情节提要的子类“MyWindow”?

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

4

4 回答 4

83

UIWindow在 Storyboard 项目中可以按照 AppleUIApplicationDelegate参考中的说明进行子类化:

窗口
当使用情节提要时,应用程序必须通过将情节提要添加到窗口并将该窗口置于屏幕上来呈现情节提要。应用程序查询窗口的这个属性。此属性保留对窗口的引用对于防止窗口被释放是必要的。如果该属性的值为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 { }
}
于 2012-05-14T08:48:17.783 回答
3

你要先继承 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
}
于 2017-03-02T22:33:41.357 回答
1

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

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

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

于 2012-05-01T20:16:14.397 回答
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

[设置界面窗口]

于 2020-04-29T15:03:44.527 回答