创建 UIView 时,无法识别的选择器在 didFinishLaunchingWithOptions 中发送 self.window 消息

Unrecognized selector sending self.window message in didFinishLaunchingWithOptions when creating a UIView

我正在使用 XCode 11 阅读 Big Nerd Ranch iOS 编程书籍(第 4 版,侧重于 Objective C),我在整理如何添加一个 UIView。

一旦我在 didFinishLaunchingWithOptions 中发送此消息

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

我收到无法识别的选择器消息。

我试过删除启动和主要情节提要但没有成功,并启用多个 windows。这是在单视图应用程序项目中(也许我应该尝试一个空项目?)

我缺少或不理解什么?我选择这本书是因为我正在尝试学习 Objective-C(而不是 Swift),而调试器并没有告诉我这里有什么问题。

谢谢。

该教程可以追溯到 UIWindowSceneDelegate 天之前。

前窗口时代(笑话)

您的代码在语法上正确的原因是 AppDelegate 符合声明 window 的协议 UIApplicationDelegate 但没有 [=48= 上的 属性 声明] 你会得到异常

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AppDelegate setWindow:]: unrecognized selector sent to instance ...'

如果您查看生成的模板项目,您可能会看到

AppDelegate.h/.m & SceneDelegate.h/.m

SceneDelegate.h 是您可以找到声明的地方:

@property (strong, nonatomic) UIWindow * window;

虽然从技术上讲您可以在

中添加该行
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions

这没有任何意义,因为 UIWindow 实例是由故事板系统为您创建的。

我的直觉是跳过本教程的那一部分,使用 SceneDelegate 中提供的 UIWindow 完成其他元素。

或者,如果您喜欢原始教程,您可以选择退出 并添加行

@property (strong, nonatomic) UIWindow * window;

AppDelegate.h