-[AppDelegate window]: unrecognized selector sent to instance

问题

[UIApplication.sharedApplication.delegate.window …] 在Xcode11新建的项目中闪退。

抛出的异常如下:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AppDelegate window]: unrecognized selector sent to instance 0x600003774260' terminating with uncaught exception of type NSException

原因

闪退的原因是找不到UIApplication.sharedApplication的delegate里面找不到window这个属性,所以闪退。

分析

Xcode11 新建的项目中和之前的Xcode新建的项目有一些区别,Xcode11新建的项目中,多了一个SceneDelegate来管理界面,包括Window等。而AppDelegate只负责应用程序的声明周期管理。

在Xcode12之前,使用UIApplication.sharedApplication.delegate.window可以获取到window这个实例是因为在AppDelegate中有window这个属性:

@interface AppDelegate : NSObject

@property (nonatomic, strong) UIWindow *window;

@end

Xcode 11创建的项目,AppDelegate里没有window这个属性,所以通过UIApplication.sharedApplication.delegate.window来取window这个属性是取不到的,所以闪退。

解决

解决办法存在很多种,如果还是想用之前的方式来获取Window的话,需要在AppDelegate中添加window属性,然后在给该属性附上值即可。

  1. AppDelegate添加window属性
@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow * window;

@end
  1. 给AppDelegate添加window的引用
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
    
    self.window = [[UIWindow alloc] initWithWindowScene:(UIWindowScene *)scene];
    self.window.backgroundColor = [UIColor whiteColor];
    ViewController *naviRootVc = [[ViewController alloc] init];
    UINavigationController *windowRootVc = [[UINavigationController alloc] initWithRootViewController:naviRootVc];
    self.window.rootViewController = windowRootVc;
    [self.window makeKeyAndVisible];
    
    [UIApplication sharedApplication].delegate.window = self.window;
}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morris_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值