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


86

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

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

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


Этот вопрос очень трудно понять. Вы можете попытаться улучшить это?
clearlight

Не уверен, что ты пытаешься сделать. Но из того, что вы предоставили, я могу спросить: было ли у вас var window: UIWindow?свойство в вашем классе AppDelegate?
lchamp

Это сообщение об ошибке, которое Xcode выплевывает в консоли
brainray

Проверьте свой класс appDelegate, он должен быть подклассом UIResponder. Если ваше приложение-делегат является подклассом UIApplication. Пожалуйста, проверьте еще раз.
Aashish1aug

Ответы:


165

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

var window: UIWindow?

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;

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?

    //...
}

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

0

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.