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

Posted

技术标签:

【中文标题】创建 UIView 时,无法识别的选择器在 didFinishLaunchingWithOptions 中发送 self.window 消息【英文标题】:Unrecognized selector sending self.window message in didFinishLaunchingWithOptions when creating a UIView 【发布时间】:2020-05-09 18:37:28 【问题描述】:

我正在使用 XCode 11 阅读 Big Nerd Ranch ios 编程书(第 4 版,侧重于 Objective C),但我无法弄清楚如何添加 UIView。

只要我在 didFinishLaunchingWithOptions 中发送此消息

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

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

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

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

谢谢。

【问题讨论】:

【参考方案1】:

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

Prewindowscene 时代(笑话)

您的代码在语法上正确的原因是 AppDelegate 符合声明 window 的协议 UIApplicationDelegate 但如果没有在类上声明属性,您将得到异常

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[AppDelegate setWindow:]: 无法识别的选择器发送到实例...'

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

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 完成其他元素。

或者,如果您对原始教程感兴趣,您可以选择退出 scene mechanics 并添加行

@property (strong, nonatomic) UIWindow * window;

AppDelegate.h

【讨论】:

非常感谢您的详尽解释。

以上是关于创建 UIView 时,无法识别的选择器在 didFinishLaunchingWithOptions 中发送 self.window 消息的主要内容,如果未能解决你的问题,请参考以下文章

-[UIView setShowsFPS:]:无法识别的选择器错误

无法识别的选择器在 iOS9 上的 facebook sdk 4.6 中发送到 facebook 登录管理器的实例

[UIView collectionView:numberOfItemsInSection:]: 无法识别的选择器发送到实例

-[UIView setRegion:animated:]: 无法识别的选择器发送到实例

PKReveal 控制器 UIVIEW 无法识别的选择器发送到实例

Swift 3:发送到实例 Xcode 8 的无法识别的选择器 [重复]