Делегат програми повинен реалізувати властивість вікна, якщо він хоче швидко використовувати основний файл розкадровки


86

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

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

У мене є файл делегата програми. Що означає повідомлення та як я можу змусити свою програму працювати?


Це питання дуже важко зрозуміти. Чи можете ви спробувати вдосконалити його?
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 і змінив Main Interface (Target -> General -> Main Interface = Main.storyboard. Досі я отримую таку саму версію .Xcode - 11.0. Як це виправити
Madhu_Nani

Не могли б ви поділитися своїм журналом розчавлень?
iMuzahid

вхідний файл 'CustomTabBar.swift' було змінено під час збірки Команда CompileSwiftSources не вдалася з ненульовим кодом виходу
Madhu_Nani

Але ваш журнал повідомляє, що ви змінили код під час створення проекту. Очистіть папку збірки (Command + Shif + K). Сподіваємось, вашу проблему буде вирішено.
iMuzahid

Так, це зроблено .. Можливо, Xcode 11 є дещо повільним у роботі пристрою.
Дякую

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

Свіфт 5 і Xcode 11

Переконайтесь, що він SceneDelegateмістить UIWindowвластивість

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    //...
}

Досить справедливо - за винятком того, що мій робить і все ще має помилку. Я підтримую, оскільки це принаймні застосовується.
StephenBoesch,

0

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


0

Налаштування в Info.plist Маніфест сцени програми> Увімкнути багатофункціональну Windows> false. Це вирішило проблему для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.