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

问题描述 投票:0回答:1

我正在使用XCode 11学习大呆子牧场的iOS编程书(第4版,主要是Objective C),我遇到了麻烦,如何添加一个UIView。

当我在didFinishLaunchingWithOptions中发送这条信息时

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

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

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

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

谢谢。

ios objective-c iphone
1个回答
1
投票

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

Prewindowscene时代(笑话)

你的代码在语法上是正确的,原因在于 AppDelegate 符合协议 UIApplicationDelegate 其中宣称 window 但如果没有在类上声明属性,你会得到异常的结果

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

如果你看一下生成的模板项目,你可能会看到以下内容

AppDelegate.h/.m &amp.是你会发现声明的地方: SceneDelegate.h/.m

SceneDelegate.h 是你会发现声明的地方。

@property (strong, nonatomic) UIWindow * window;

虽然技术上你可以在

- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions

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

我的直觉是跳过这块教程,使用提供的故事板系统创建其他元素。UIWindowSceneDelegate.

另外,如果你有你的心脏设置在原来的教程,你可以选择退出。场景力学 并加上

@property (strong, nonatomic) UIWindow * window;

AppDelegate.h

© www.soinside.com 2019 - 2024. All rights reserved.