如果要使用主故事板文件swift,则应用程序委托必须实现window属性。


82

我刚刚开发了一个应用程序,但是在模拟器中运行时,调试器控制台会显示:

如果要使用主故事板文件,则该应用程序委托必须实现window属性。

我有一个应用程序委托文件。该消息是什么意思,如何使我的应用正常工作?


这个问题很难理解。您可以尝试改善它吗?
clearlight

不确定您要做什么。但是从您提供的内容来看,我可能会问:您是否var window: UIWindow?在AppDelegate类中拥有该属性?
lchamp 2015年

这是Xcode在控制台中吐出的错误消息
brainray

检查您的appDelegate类,它应该是UIResponder的子类。如果您的app-delegate是UIApplication的子类。请再次检查。
Aashish1aug

Answers:


158

确保在AppDelegate类中具有以下属性声明:

var window: UIWindow?

9
仅仅声明一个属性怎么解决了这个问题!开发人员确实疯了。
Sazzad Hissain Khan

109

如果您在iOS 13.0之前的版本上运行项目,则将遇到问题。由于iOS 13及更高版本,应用程序的启动方式与早期版本不同。

  • 在iOS 13及更高版本中,使用UISceneDelegate对象响应基于场景的应用程序中的生命周期事件

  • 在iOS 12及更低版本中,使用UIApplicationDelegate对象响应生命周期事件。

当您在iOS 12及更早版本中启动该应用程序时,课堂将像UIApplicationMainAppDelegate课堂上一样期待window属性SceneDelegate。因此,如果您在AppDelegate类中添加以下行,则将解决您的问题。

var window: UIWindow?

对于Objective-C

@property (strong, nonatomic) UIWindow *window;

您可以在此处找到更多应用程序的生命周期


1
我在AppDelegate类中写了这一行,然后我更改了Main Interface(目标-> 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

29

以防万一有人再次遇到这个问题并且正在使用Objective-C进行编程,请确保您的AppDelegate.h文件中包含以下代码行:

@property (strong, nonatomic) UIWindow *window;

22

在XCode 11中创建新项目时,我收到此错误。我没有使用过SwiftUI。这是我考虑过解决的步骤。

  1. Application Scene Manifest从中删除的条目Info.plist
  2. 删除SceneDelegate.swift文件
  3. 删除AppDelegate.swift班级中所有与场景相关的方法
  4. var window: UIWindow?AppDelegate.swift课堂上增加财产

完成这些步骤后,我可以在iOS 13之前的版本上运行该应用程序。

[编辑]
最后,您的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
    }

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?

    //...
}

足够公平-除了我的并且仍然有错误。我会投票,因为它至少适用。
StephenBoesch

0

早就回答了,但要帮助理解上面有关为什么简单添加window属性即可解决问题的上述问题,请注意,应用程序委托符合UIApplicationDelegate定义属性的协议@property (nullable, nonatomic, strong) UIWindow *window;,类需要提供该类来指定window to use when presenting a storyboard。提供失败会导致Xcode日志警告。


0

在Appdelegate文件中添加以下窗口声明

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window:UIWindow?
    ...

如果您应用的Info.plist文件包含UIMainStoryboardFile键,则需要实现此属性。 此综合属性的默认值为nil,这将导致应用创建通用的UIWindow对象并将其分配给该属性。如果要为您的应用程序提供自定义窗口,则必须实现此属性的getter方法,并使用它来创建和返回自定义窗口。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.