Closed5

[SwiftUI] AppDelegate window にアクセスしようとしてクラッシュ

Yusuke AriyoshiYusuke Ariyoshi

特定の場面で次のようなエラーでクラッシュが起こった。

libc++abi: terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[SwiftUI.AppDelegate window]: unrecognized selector sent to instance 0x600001fdc400'
terminating with uncaught exception of type NSException

環境

  • Xcode 12.5
  • iOS 14.5
Yusuke AriyoshiYusuke Ariyoshi

SwiftUI 以前に作られたコードで、window のインスタンスにアクセスするコードがある。

AppDelegate を持たずに開始したプロジェクトの場合 (プロジェクト作成時にInterface をUIKit App Delegate ではなく SwiftUI App にした場合) 、AppDelegate のwindow インスタンスが無いため上記のクラッシュが起こってしまう。

Yusuke AriyoshiYusuke Ariyoshi

解決方法

@UIApplicationDelegateAdaptor を使い、AppDelegate を定義する。
その際にwindow 変数を定義しておく。(定義しないと表題のようにクラッシュする)

@main
struct YourApp: App {
+    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
+ class AppDelegate: UIResponder, UIApplicationDelegate {
+     var window: UIWindow?
+ }
Yusuke AriyoshiYusuke Ariyoshi

そもそもSwiftUI からwindow にアクセスするような処理はなるべく避けた方が良い?
ViewController を使わざるをえない場面でも、表示の処理はSwiftUI 側だけで完結させるのが良さそうな予感。

このスクラップは2021/05/21にクローズされました