Делегат приложения должен реализовать свойство окна, если он хочет использовать быстрый файл раскадровки.

86

Я только что разработал приложение, но при запуске в симуляторе консоль отладчика говорит:

Делегат приложения должен реализовать свойство окна, если он хочет использовать основной файл раскадровки.

У меня есть файл делегата приложения. Что означает сообщение и как заставить мое приложение работать?

Итан Маркус
источник
Этот вопрос очень трудно понять. Вы можете попытаться улучшить это?
clearlight
Не уверен, что ты пытаешься сделать. Но из того, что вы предоставили, я могу спросить: было ли у вас var window: UIWindow?свойство в вашем классе AppDelegate?
lchamp
Это сообщение об ошибке, которое Xcode выплевывает в консоли
brainray
Проверьте свой класс appDelegate, он должен быть подклассом UIResponder. Если ваше приложение-делегат является подклассом UIApplication. Пожалуйста, проверьте еще раз.
Aashish1aug

Ответы:

165

Убедитесь, что в вашем классе AppDelegate есть следующее объявление свойства:

var window: UIWindow?
Muneeb
источник
9
Почему проблема решена, просто объявив недвижимость! Разработчики действительно сумасшедшие.
Sazzad Hissain Khan
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 и изменил основной интерфейс (Target -> General -> Main Interface = 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;
TomTom
источник
23

Я получил эту ошибку, когда создавал новый проект в XCode 11. Я не использовал SwiftUI. Вот шаги, которые я решил исправить.

  1. Удалена Application Scene Manifestзапись изInfo.plist
  2. Удаленный SceneDelegate.swiftфайл
  3. В AppDelegate.swiftклассе удалены все методы, связанные со сценой.
  4. добавлена var window: UIWindow?недвижимость в AppDelegate.swiftклассе

После этих шагов я могу запустить приложение в версии до iOS 13.

[EDIT]
Наконец, ваш 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
Abhijith 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 и назначать его свойству. Если вы хотите предоставить настраиваемое окно для своего приложения, вы должны реализовать метод получения этого свойства и использовать его для создания и возврата настраиваемого окна.

Судан Сувал
источник
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?

    //...
}
yoAlex5
источник
Достаточно справедливо - за исключением моего, и все еще есть ошибка. Я буду поддерживать, поскольку это, по крайней мере, применимо.
Стивен Бош
0

Давно ответил, но чтобы помочь понять приведенные выше вопросы о том, почему простое добавление свойства окна решает проблему, обратите внимание, что делегат приложения соответствует UIApplicationDelegateпротоколу, который определяет свойство, @property (nullable, nonatomic, strong) UIWindow *window;которое классы должны предоставить, чтобы указать window to use when presenting a storyboard. Неспособность предоставить это вызывает предупреждения журнала Xcode.

Теренс
источник
0

Настройка в Info.plist Application Scene Manifest> Enable Mutliple Windows> false. Это решило проблему для меня.

Мухаммед Али Акташ
источник