Der App-Delegat muss die Fenstereigenschaft implementieren, wenn er eine schnelle Haupt-Storyboard-Datei verwenden möchte

82

Ich habe gerade eine App entwickelt, aber wenn sie im Simulator ausgeführt wird, sagt die Debugger-Konsole:

Der App-Delegat muss die Fenstereigenschaft implementieren, wenn er eine Haupt-Storyboard-Datei verwenden möchte.

Ich habe eine App-Delegatendatei. Was bedeutet die Nachricht und wie kann ich meine App zum Laufen bringen?

Ethan Marcus
quelle
Diese Frage ist sehr schwer zu verstehen. Können Sie versuchen, es zu verbessern?
klares Licht
Ich bin mir nicht sicher, was du versuchst zu tun. Aber von dem, was Sie angegeben haben, kann ich fragen: var window: UIWindow?Hatten Sie die Eigenschaft in Ihrer AppDelegate-Klasse?
Lchamp
Dies ist die Fehlermeldung, die Xcode in der Konsole
ausspuckt
Überprüfen Sie Ihre appDelegate-Klasse. Es sollte die Unterklasse von UIResponder sein. Wenn Ihr App-Delegat eine Unterklasse von UIApplication ist. Bitte überprüfen Sie es noch einmal.
Aashish1aug

Antworten:

159

Stellen Sie sicher, dass Ihre AppDelegate-Klasse die folgende Eigenschaftsdeklaration enthält:

var window: UIWindow?
Muneeb
quelle
9
Wie kommt es, dass nur das Deklarieren einer Immobilie das Problem gelöst hat? Entwickler sind in der Tat verrückt.
Sazzad Hissain Khan
109

Wenn Sie Ihr Projekt früher als iOS 13.0 ausführen, tritt in diesem Fall das Problem auf. Aufgrund von iOS 13 und höher wird die App anders gestartet als in früheren Versionen.

  • Verwenden Sie in iOS 13 und höher UISceneDelegateObjekte, um auf Lebenszyklusereignisse in einer szenenbasierten App zu reagieren

  • Verwenden Sie das UIApplicationDelegateObjekt in iOS 12 und früheren Versionen, um auf Lebenszyklusereignisse zu reagieren.

Wenn Sie die App in iOS 12 und früher starten, UIApplicationMainerwartet die Klasse eine Fenstereigenschaft in Ihrer AppDelegateKlasse wie SceneDelegatezuvor. Ihr Problem wird also gelöst, wenn Sie der AppDelegateKlasse die folgende Zeile hinzufügen .

var window: UIWindow?

Für Ziel-C

@property (strong, nonatomic) UIWindow *window;

Weitere Informationen finden Sie hier im Lebenszyklus der App .

iMuzahid
quelle
1
Ich habe diese Zeile in der AppDelegate-Klasse geschrieben und die Hauptschnittstelle (Ziel -> Allgemein -> Hauptschnittstelle = Main.storyboard geändert. Ich erhalte immer noch die gleiche .Xcode-Version ist 11.0. So beheben Sie sie
Madhu_Nani
Könnten Sie bitte Ihr Crush-Protokoll teilen?
iMuzahid
Die Eingabedatei 'CustomTabBar.swift' wurde während des Build-Befehls geändert. CompileSwiftSources schlug mit einem Exit-Code ungleich Null fehl
Madhu_Nani
In Ihrem Protokoll wird jedoch angegeben, dass Sie Ihren Code beim Erstellen Ihres Projekts geändert haben. Bereinigen Sie Ihren Build-Ordner (Befehl + Umschalt + K). Hoffe, Ihr Problem wird behoben.
iMuzahid
Ja, es ist geschafft. Vielleicht ist Xcode 11 etwas langsam im Gerät. Danke
Madhu_Nani
29

Nur für den Fall, dass jemand erneut darauf stößt und in Objective-C programmiert, stellen Sie sicher, dass Sie diese Codezeile in Ihrer AppDelegate.hDatei haben:

@property (strong, nonatomic) UIWindow *window;
TomTom
quelle
22

Ich habe diesen Fehler erhalten, als ich ein neues Projekt in XCode 11 erstellt habe. Ich habe es nicht verwendet SwiftUI. Hier sind die Schritte, die ich in Betracht gezogen habe, um dies zu beheben.

  1. Application Scene ManifestEintrag gelöscht vonInfo.plist
  2. Gelöschte SceneDelegate.swiftDatei
  3. Alle szenenbezogenen Methoden in der AppDelegate.swiftKlasse gelöscht
  4. var window: UIWindow?Eigenschaft in AppDelegate.swiftKlasse hinzugefügt

Nach diesen Schritten kann ich die App auf einer Version vor iOS 13 ausführen.

[BEARBEITEN]
Schließlich sollte Ihre AppDelegate.swiftDatei ungefähr so ​​aussehen.

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
    }

}
Sravan
quelle
2
Wenn Sie swiftUI nicht verwenden, sollte dies die richtige Antwort für mich sein. Danke @Sarvan
Abhijith Brumal
6

Ich hatte das gleiche Problem, fügen Sie einfach hinzu, var window: UIWindow?wie der Debug-Fehler sagt.

@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
    }
Yodagama
quelle
2

Sie können Ihre App-Delegatenklasse überprüfen:

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.
    }
}
Deepak Kumar
quelle
2

Swift 5 & Xcode 11

Stellen Sie sicher, dass diese Eigenschaft SceneDelegateenthältUIWindow

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    //...
}
yoAlex5
quelle
Fair genug - außer meiner hat und hat immer noch den Fehler. Ich werde upvoten, da es zumindest anwendbar ist.
StephenBoesch
0

Vor langer Zeit beantwortet, aber um die obigen Fragen zu verstehen, warum das Hinzufügen der Fenstereigenschaft das Problem löst, beachten Sie, dass der App-Delegat dem UIApplicationDelegateProtokoll entspricht, das eine Eigenschaft definiert, @property (nullable, nonatomic, strong) UIWindow *window;die Klassen bereitstellen müssen, um die zu spezifizieren window to use when presenting a storyboard. Wenn dies nicht angegeben wird, werden die Xcode-Protokollwarnungen ausgegeben.

terence
quelle
0

Fügen Sie die folgende Fensterdeklaration in die Appdelegate-Datei ein

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

Die Implementierung dieser Eigenschaft ist erforderlich, wenn die Info.plist-Datei Ihrer App den Schlüssel UIMainStoryboardFile enthält. Der Standardwert dieser synthetisierten Eigenschaft ist nil. Dadurch erstellt die App ein generisches UIWindow-Objekt und weist es der Eigenschaft zu. Wenn Sie ein benutzerdefiniertes Fenster für Ihre App bereitstellen möchten, müssen Sie die Getter-Methode dieser Eigenschaft implementieren und zum Erstellen und Zurückgeben Ihres benutzerdefinierten Fensters verwenden.

Sudan Suwal
quelle
0

Einstellung im Info.plist-Anwendungsszenenmanifest> Mehrfachfenster aktivieren> false. Dies löste das Problem für mich.

Muhammed Ali Aktaş
quelle