Delegat aplikacji musi zaimplementować właściwość okna, jeśli chce szybko użyć głównego pliku scenorysu

86

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ę?

Ethan Marcus
źródło
To pytanie jest bardzo trudne do zrozumienia. Czy możesz spróbować to poprawić?
jasne światło
Nie jestem pewien, co próbujesz zrobić. Ale z tego, co podałeś, mogę zapytać: czy masz var window: UIWindow?właściwość w swojej klasie AppDelegate?
lchamp
To jest komunikat o błędzie, który Xcode wypluwa na konsolę
brainray
Sprawdź swoją klasę appDelegate, powinna to być podklasa UIResponder. Jeśli delegat aplikacji jest podklasą UIApplication. Sprawdź to jeszcze raz.
Aashish1aug

Odpowiedzi:

165

Upewnij się, że w klasie AppDelegate masz następującą deklarację właściwości:

var window: UIWindow?
muneeb
źródło
9
Dlaczego samo zadeklarowanie nieruchomości rozwiązało problem! Deweloperzy są naprawdę szaleni.
Sazzad Hissain Khan
113

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 UISceneDelegateobiektów do reagowania na zdarzenia cyklu życia w aplikacji opartej na scenach

  • W 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 UIApplicationMainklasa oczekuje właściwości okna w swojej AppDelegateklasie, podobnie jak SceneDelegatema. Twój problem zostanie rozwiązany, jeśli dodasz następujący wiersz do swojej AppDelegateklasy.

var window: UIWindow?

W przypadku Objective-C

@property (strong, nonatomic) UIWindow *window;

Więcej informacji znajdziesz tutaj Cykl życia aplikacji .

iMuzahid
źródło
1
Napisałem tę linię w klasie AppDelegate i zmieniłem główny interfejs (Target -> General -> Main Interface = Main.storyboard. Nadal otrzymuję tę samą wersję .Xcode to 11.0. Jak to naprawić
Madhu_Nani
Czy mógłbyś udostępnić swój dziennik sympatii?
iMuzahid
plik wejściowy „CustomTabBar.swift” został zmodyfikowany podczas kompilacji Polecenie CompileSwiftSources nie powiodło się z niezerowym kodem zakończenia
Madhu_Nani
Ale Twój dziennik mówi, że zmodyfikowałeś kod podczas tworzenia projektu. Wyczyść folder kompilacji (Command + Shif + K). Mam nadzieję, że twój problem zostanie rozwiązany.
iMuzahid
Tak, gotowe ... Może Xcode 11 działa wolno w urządzeniu. Dzięki
Madhu_Nani
31

Na wypadek, gdyby ktoś ponownie to spotkał i programuje w Objective-C, upewnij się, że masz w AppDelegate.hpliku następujący wiersz kodu :

@property (strong, nonatomic) UIWindow *window;
TomTom
źródło
23

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ć.

  1. Usunięty Application Scene Manifestwpis zInfo.plist
  2. Usunięto SceneDelegate.swiftPlik
  3. Usunięto wszystkie metody związane ze scenami w AppDelegate.swift klasie
  4. dodana var window: UIWindow?właściwość w AppDelegate.swiftklasie

Po wykonaniu tych czynności mogę uruchomić aplikację w wersji wcześniejszej niż iOS 13.

[EDYCJA]
Wreszcie, twój AppDelegate.swiftplik 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
    }

}
Sravan
źródło
2
Jeśli nie używasz swiftUI, to powinna być poprawna odpowiedź. Dzięki @Sarvan
Abhijith Brumal
6

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
    }
Yodagama
źródło
3

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.

sudan suwal
źródło
2

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.
    }
}
Deepak Kumar
źródło
2

Swift 5 i Xcode 11

Upewnij się, że SceneDelegatezawiera UIWindowwłaściwość

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    //...
}
yoAlex5
źródło
W porządku - z wyjątkiem mojego robi i nadal ma błąd. Głosuję za głosem, ponieważ ma to przynajmniej zastosowanie.
StephenBoesch
0

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 UIApplicationDelegateprotokoł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.

terence
źródło
0

Ustawienie w Info.plist Application Scene Manifest> Enable Mutliple Windows> false. To rozwiązało problem.

Muhammed Ali Aktaş
źródło