iOS模拟器创建视图时显示空白屏——《Big Nerd Ranch iOS编程第4版》求助
解决AppDelegate创建视图后模拟器空白的问题
核心原因
iOS 13及以后版本引入了Scene会话架构,AppDelegate不再负责管理应用窗口的生命周期,窗口的创建和管理被移交给了SceneDelegate。你按照旧版教材在AppDelegate中创建的UIWindow不会被系统识别并使用,所以视图无法显示。
两种解决方案
方案一:关闭Scene支持,和教材代码保持同步
这种方式适合完全跟随教材步骤,回到旧版窗口管理模式:
- 打开项目的
Info配置页,找到Application Scene Manifest条目,右键删除整个配置项。 - 删除项目中的
SceneDelegate.h和SceneDelegate.m文件。 - 在
AppDelegate.h中确保已添加window属性:@property (strong, nonatomic) UIWindow *window; - 保留
AppDelegate.m中application:didFinishLaunchingWithOptions:的代码,删除所有Scene相关的方法(即#pragma mark - UISceneSession lifecycle下方的两个方法)。
方案二:适配现代Scene架构,将代码移至SceneDelegate
这种方式符合当前iOS标准开发模式:
- 打开
SceneDelegate.m,找到scene:willConnectToSession:options:方法,替换为以下代码:- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions { UIWindowScene *windowScene = (UIWindowScene *)scene; self.window = [[UIWindow alloc] initWithWindowScene:windowScene]; self.window.frame = windowScene.coordinateSpace.bounds; // 创建红色视图并设置居中位置 CGFloat screenWidth = windowScene.coordinateSpace.bounds.size.width; CGFloat screenHeight = windowScene.coordinateSpace.bounds.size.height; CGRect firstFrame = CGRectMake((screenWidth - 100)/2, (screenHeight - 150)/2, 100, 150); BNRHypnosisView *firstView = [[BNRHypnosisView alloc] initWithFrame:firstFrame]; firstView.backgroundColor = [UIColor redColor]; [self.window addSubview:firstView]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; } - 打开
AppDelegate.m,清空application:didFinishLaunchingWithOptions:中创建window和视图的代码,只保留基础初始化:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { return YES; }
额外优化提示
你原本写的CGRectMake(160, 240, 100, 150)是固定坐标,在不同尺寸的设备上无法保证居中。方案二中的代码已改成基于屏幕尺寸计算居中位置,能适配所有设备。
内容的提问来源于stack exchange,提问作者nicktorres
相关产品推荐
相关产品推荐

