Właśnie stworzyłem aplikację, ale podczas uruchamiania w symulatorze konsola debuggera mówi:
Delegat aplikacji musi zaimplementować właściwość okna, jeśli chce użyć głównego pliku scenorysu.
Mam plik delegata aplikacji. Co oznacza ten komunikat i jak mogę uruchomić moją aplikację?
var window: UIWindow?
właściwość w swojej klasie AppDelegate?Odpowiedzi:
Upewnij się, że w klasie AppDelegate masz następującą deklarację właściwości:
var window: UIWindow?
źródło
Jeśli uruchomisz swój projekt na systemie wcześniejszym niż iOS 13.0, w takim przypadku napotkasz problem. Ze względu na iOS 13 i nowsze wersje uruchamiają się inaczej niż we wcześniejszych wersjach.
W systemie iOS 13 i nowszych używaj
UISceneDelegate
obiektów do reagowania na zdarzenia cyklu życia w aplikacji opartej na scenachW systemie iOS 12 i wcześniejszych użyj
UIApplicationDelegate
obiektu do reagowania na zdarzenia cyklu życia.Po uruchomieniu aplikacji w systemie iOS 12 lub wcześniejszym
UIApplicationMain
klasa oczekuje właściwości okna w swojejAppDelegate
klasie, podobnie jakSceneDelegate
ma. Twój problem zostanie rozwiązany, jeśli dodasz następujący wiersz do swojejAppDelegate
klasy.var window: UIWindow?
W przypadku Objective-C
@property (strong, nonatomic) UIWindow *window;
Więcej informacji znajdziesz tutaj Cykl życia aplikacji .
źródło
Na wypadek, gdyby ktoś ponownie to spotkał i programuje w Objective-C, upewnij się, że masz w
AppDelegate.h
pliku następujący wiersz kodu :@property (strong, nonatomic) UIWindow *window;
źródło
Otrzymałem ten błąd podczas tworzenia nowego projektu w XCode 11. Nie używałem
SwiftUI
. Oto kroki, które rozważałem, aby to naprawić.Application Scene Manifest
wpis zInfo.plist
SceneDelegate.swift
PlikAppDelegate.swift
klasievar window: UIWindow?
właściwość wAppDelegate.swift
klasiePo wykonaniu tych czynności mogę uruchomić aplikację w wersji wcześniejszej niż iOS 13.
[EDYCJA]
Wreszcie, twój
AppDelegate.swift
plik powinien wyglądać mniej więcej tak.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 } }
źródło
Miałem ten sam problem, po prostu dodaj
var window: UIWindow?
zgodnie z błędem debugowania.@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 }
źródło
Dodaj następującą deklarację okna w pliku Appdelegate
@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window:UIWindow? ...
Implementacja tej właściwości jest wymagana, jeśli plik Info.plist aplikacji zawiera klucz UIMainStoryboardFile. Wartość domyślna tej zsyntetyzowanej właściwości to nil, co powoduje, że aplikacja tworzy ogólny obiekt UIWindow i przypisuje go do właściwości. Jeśli chcesz zapewnić niestandardowe okno dla swojej aplikacji, musisz zaimplementować metodę pobierania tej właściwości i użyć jej do utworzenia i zwrócenia niestandardowego okna.
źródło
Możesz sprawdzić klasę delegata aplikacji:
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. } }
źródło
Swift 5 i Xcode 11
Upewnij się, że
SceneDelegate
zawieraUIWindow
właściwośćclass SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? //... }
źródło
Dawno temu odpowiedział, ale aby pomóc zrozumieć powyższe pytania dotyczące tego, dlaczego proste dodanie właściwości okna rozwiązuje problem, zwróć uwagę, że delegat aplikacji jest zgodny z
UIApplicationDelegate
protokołem definiującym właściwość,@property (nullable, nonatomic, strong) UIWindow *window;
którą klasy muszą podać, aby określićwindow to use when presenting a storyboard
. Brak podania powodu powoduje ostrzeżenia dziennika Xcode.źródło
Ustawienie w Info.plist Application Scene Manifest> Enable Mutliple Windows> false. To rozwiązało problem.
źródło