创建 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:]: 无法识别的选择器发送到实例