31

この質問で説明したのと同じ問題があります:

アプリが使用するウィンドウをUIWindowからストーリーボード付きの独自のサブクラス「MyWindow」に変更するにはどうすればよいですか?

私の質問は、「MyWindow」サブクラスを返す「window」ゲッターメソッドをアプリデリゲートに実装するにはどうすればよいですか?または、サブクラスをアプリのメインウィンドウに割り当てる他の方法がありますか?

4

4 に答える 4

83

UIWindowUIApplicationDelegateストーリーボードプロジェクトでは、Appleのリファレンスで説明されているようにサブクラス化できます。

window
ストーリーボードを使用している場合、アプリケーションはストーリーボードをウィンドウに追加し、そのウィンドウを画面に表示して、ストーリーボードを表示する必要があります。アプリケーションは、このプロパティにウィンドウを照会します。このプロパティによるウィンドウへの保持された参照は、ウィンドウが解放されないようにするために必要です。プロパティの値がnil(デフォルト)の場合、アプリケーションはの汎用インスタンスを作成UIWindowし、デリゲートが参照できるようにこのプロパティに割り当てます。このプロトコルのgetterメソッドを実装して、アプリケーションに別のウィンドウを提供することができます。

つまり、AppDelegate実装に次のゲッターを追加するだけです。

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に'sreturnを" 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を返すだけです

[UIWindowの設定]

于 2020-04-29T15:03:44.527 に答える