メインストーリーボードファイルをすばやく使用する場合、アプリデリゲートはwindowプロパティを実装する必要があります


86

アプリを開発したばかりですが、シミュレーターで実行すると、デバッガーコンソールに次のように表示されます。

メインストーリーボードファイルを使用する場合、アプリデリゲートはwindowプロパティを実装する必要があります。

アプリのデリゲートファイルがあります。メッセージの意味と、アプリを機能させるにはどうすればよいですか?


その質問を理解するのは非常に難しいです。あなたはそれを改善しようと試みることができますか?
クリアライト2015

何をしようとしているのかわからない。しかし、あなたが提供したものから、私は尋ねるかもしれません:あなたはvar window: UIWindow?あなたのAppDelegateクラスにプロパティを持っていましたか?
lchamp 2015

これは、Xcodeがコンソールに吐き出すエラーメッセージです
brainray 2015年

appDelegateクラスを確認してください。UIResponderのサブクラスである必要があります。app-delegateがUIApplicationのサブクラスである場合。もう一度ご確認ください。
Aashish1aug

回答:


165

AppDelegateクラスに次のプロパティ宣言があることを確認してください。

var window: UIWindow?

9
プロパティを宣言するだけで問題が解決したのはなぜですか。開発者は確かに夢中です。
Sazzad HissainKhan20年

113

iOS 13.0より前のバージョンでプロジェクトを実行すると、問題が発生します。iOS 13以降のため、アプリの起動は以前のバージョンとは異なります。

  • iOS 13以降では、UISceneDelegateオブジェクトを使用して、シーンベースのアプリのライフサイクルイベントに応答します

  • iOS 12以前では、UIApplicationDelegateオブジェクトを使用してライフサイクルイベントに応答します。

あなたはiOSの12およびそれ以前にアプリを起動すると、その後UIApplicationMainクラスあなたのウィンドウのプロパティを期待するAppDelegateなどのクラスSceneDelegateがあります。したがって、AppDelegateクラスに次の行を追加すると、問題は解決されます。

var window: UIWindow?

Objective-Cの場合

@property (strong, nonatomic) UIWindow *window;

詳細については、アプリのライフサイクルをご覧ください。


1
この行をAppDelegateクラスで記述し、メインインターフェイスを変更しました([ターゲット]-> [一般]-> [メインインターフェイス= Main.storyboard]。それでも同じです。Xcodeバージョンは11.0です。修正方法
Madhu_Nani

クラッシュログを共有していただけませんか?
iMuzahid

入力ファイル「CustomTabBar.swiftは」ゼロ以外の終了コードで失敗したビルドコマンドCompileSwiftSources中に変更されました
Madhu_Nani

ただし、ログには、プロジェクトのビルド時にコードを変更したことが示されています。ビルドフォルダーをクリーンアップします(Command + Shif + K)。あなたの問題が再び愛されることを願っています。
iMuzahid

うん、それは..MayはXcodeの11も行うのデバイス.Thanksでいくつかの遅い
Madhu_Nani

31

誰かがこれに再び遭遇し、Objective-Cでプログラミングしている場合に備えて、AppDelegate.hファイルに次のコード行があることを確認してください。

@property (strong, nonatomic) UIWindow *window;

23

XCode 11で新しいプロジェクトを作成したときに、このエラーが発生しました。を使用していませんSwiftUI。これが手順です、私はこれを修正することを検討しました。

  1. Application Scene Manifestからエントリを削除しましたInfo.plist
  2. 削除されたSceneDelegate.swiftファイル
  3. AppDelegate.swiftクラス内のすべてのシーン関連メソッドを削除しました
  4. クラスにvar window: UIWindow?プロパティを追加AppDelegate.swift

これらの手順を実行すると、iOS13より前のバージョンでアプリを実行できるようになります。

[編集]
最後に、AppDelegate.swiftファイルは次のようになります。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

}

2
swiftUIを使用していない場合は、これが正しい答えであるはずです。おかげ@Sarvan
アブヒジスBrumal

6

私は同じ問題を抱えていましたがvar window: UIWindow?、デバッグエラーが言うように追加してください。

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

3

Appdelegateファイルに次のウィンドウ宣言を追加します

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window:UIWindow?
    ...

アプリのInfo.plistファイルにUIMainStoryboardFileキーが含まれている場合は、このプロパティの実装が必要です。 この合成されたプロパティのデフォルト値はnilです。これにより、アプリは汎用UIWindowオブジェクトを作成し、それをプロパティに割り当てます。アプリにカスタムウィンドウを提供する場合は、このプロパティのgetterメソッドを実装し、それを使用してカスタムウィンドウを作成して返す必要があります。


2

アプリのデリゲートクラスを確認できます。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

    // MARK: UISceneSession Lifecycle

    @available(iOS 13.0, *)
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    @available(iOS 13.0, *)
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }
}

2

Swift 5&Xcode 11

プロパティがSceneDelegate含まれていることを確認してくださいUIWindow

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    //...
}

十分に公平です-私の場合を除いて、エラーが発生します。少なくとも適用できるので、私は賛成します。
StephenBoesch

0

ずっと前に答え​​ましたが、ウィンドウプロパティを追加するだけで問題が解決する理由に関する上記の質問を理解しやすくするために、アプリデリゲートUIApplicationDelegateはプロパティを定義するプロトコルに準拠していることに注意してください。@property (nullable, nonatomic, strong) UIWindow *window;クラスはを指定するために提供する必要がありますwindow to use when presenting a storyboard。それを提供しないと、Xcodeログの警告が発生します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.