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?
var window: UIWindow?
Hatten Sie die Eigenschaft in Ihrer AppDelegate-Klasse?Antworten:
Stellen Sie sicher, dass Ihre AppDelegate-Klasse die folgende Eigenschaftsdeklaration enthält:
var window: UIWindow?
quelle
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
UISceneDelegate
Objekte, um auf Lebenszyklusereignisse in einer szenenbasierten App zu reagierenVerwenden Sie das
UIApplicationDelegate
Objekt in iOS 12 und früheren Versionen, um auf Lebenszyklusereignisse zu reagieren.Wenn Sie die App in iOS 12 und früher starten,
UIApplicationMain
erwartet die Klasse eine Fenstereigenschaft in IhrerAppDelegate
Klasse wieSceneDelegate
zuvor. Ihr Problem wird also gelöst, wenn Sie derAppDelegate
Klasse 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 .
quelle
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.h
Datei haben:@property (strong, nonatomic) UIWindow *window;
quelle
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.Application Scene Manifest
Eintrag gelöscht vonInfo.plist
SceneDelegate.swift
DateiAppDelegate.swift
Klasse gelöschtvar window: UIWindow?
Eigenschaft inAppDelegate.swift
Klasse hinzugefügtNach diesen Schritten kann ich die App auf einer Version vor iOS 13 ausführen.
[BEARBEITEN]
Schließlich sollte Ihre
AppDelegate.swift
Datei 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 } }
quelle
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 }
quelle
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. } }
quelle
Swift 5 & Xcode 11
Stellen Sie sicher, dass diese Eigenschaft
SceneDelegate
enthältUIWindow
class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? //... }
quelle
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
UIApplicationDelegate
Protokoll entspricht, das eine Eigenschaft definiert,@property (nullable, nonatomic, strong) UIWindow *window;
die Klassen bereitstellen müssen, um die zu spezifizierenwindow to use when presenting a storyboard
. Wenn dies nicht angegeben wird, werden die Xcode-Protokollwarnungen ausgegeben.quelle
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.
quelle
Einstellung im Info.plist-Anwendungsszenenmanifest> Mehrfachfenster aktivieren> false. Dies löste das Problem für mich.
quelle