この質問で説明したのと同じ問題があります:
アプリが使用するウィンドウをUIWindowからストーリーボード付きの独自のサブクラス「MyWindow」に変更するにはどうすればよいですか?
私の質問は、「MyWindow」サブクラスを返す「window」ゲッターメソッドをアプリデリゲートに実装するにはどうすればよいですか?または、サブクラスをアプリのメインウィンドウに割り当てる他の方法がありますか?
この質問で説明したのと同じ問題があります:
アプリが使用するウィンドウをUIWindowからストーリーボード付きの独自のサブクラス「MyWindow」に変更するにはどうすればよいですか?
私の質問は、「MyWindow」サブクラスを返す「window」ゲッターメソッドをアプリデリゲートに実装するにはどうすればよいですか?または、サブクラスをアプリのメインウィンドウに割り当てる他の方法がありますか?
UIWindow
UIApplicationDelegate
ストーリーボードプロジェクトでは、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 { }
}
最初に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
}
私自身のアプリではwindow
、Xcodeテンプレートから新しいアプリを作成するときにAppDelegate.hで宣言された""プロパティを見てきました。
そのプロパティを変更して、その時点でUIWindow
「」から「」に変更できます。MyWindow
または、あまり洗練されていないソリューションでは、アクセス時window
に'sreturnを" MyWindow
"オブジェクトタイプにキャストするだけです。
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を返すだけです