iOS-Xcode11: 删除默认Main.storyBoard, 自定义UIWindow不能在AppDelegate中处理,新增SceneDelegate代理

本文介绍了Xcode11更新后,iOS13中App Delegate职责的变化,UI生命周期由SceneDelegate接管。删除Main.storyboard并配置Info.plist及General设置后,需在SceneDelegate中初始化UIWindow和Root ViewController。详细解析了SceneDelegate的关键生命周期方法,如sceneWillConnectToSession、sceneDidDisconnect等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更新Xcode11之后,删除Main.storyboard,且删除Main storyboard file base name之后运行报错

Xcode11自动新增了一个SceneDelegate文件,查找了一下官方文档WWDC2019:Optimizing App Launch 发现iOS13中appdelegate的职责发现了改变:

iOS13之前,Appdelegate的职责全权处理App生命周期和UI生命周期;

iOS13之后,Appdelegate的职责是:

1、处理 App 生命周期

2、新的 Scene Session 生命周期

那UI的生命周期呢?交给新增的Scene Delegate处理, Appdelegate不在负责UI生命周期,所有UI生命周期交给SceneDelegate处理

因此Xcode11之后,除了与以前一样,

要在项目Info.plist删除Main storyboard file base name:(指定应用启动时加载的storyboard文件名);

或者Main nib file base name:(指定应用启动时加载的xib文件名)之外,

还要删除SceneDelegate的StoryboardName

或者在General----Deployment Info----Main Interface中清除Main.storyboard

在AppDelegate中自定义UIWindow,代码不起作用

因此初始化window方法需要改变: 现在不再在Appdelegate的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions进行初始化

而是在SceneDelegate中初始化了

- (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).
    
    UIWindowScene *windowScene = (UIWindowScene *)scene;
    self.window = [[UIWindow alloc] initWithWindowScene:windowScene];
    MainViewController *launchVC = [[MainViewController alloc] init];
    self.window.rootViewController    = launchVC;
    self.window.backgroundColor       = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
}

SceneDelegate 生命周期

- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    NSLog(@"场景加载完成");
// iOS 12上的 application(_:didFinishLaunchingWithOptions:) 函数的作用最相似。当将场景添加到app中时scene(_:willConnectTo:options:)函数会被调用的。
}
- (void)sceneDidDisconnect:(UIScene *)scene {
    NSLog(@"场景已经断开连接");
// (注意,以后它可能被重新连接)
}
- (void)sceneDidBecomeActive:(UIScene *)scene {
    NSLog(@"已经从后台进入前台 ");
//(例如从应用切换器中选择场景)
}
- (void)sceneWillResignActive:(UIScene *)scene {
    NSLog(@"即将从前台进入后台");
//(例如通过切换器切换到另一个场景)
}
- (void)sceneWillEnterForeground:(UIScene *)scene {
    NSLog(@"即将从后台进入前台");
}
- (void)sceneDidEnterBackground:(UIScene *)scene {
    NSLog(@"已经从前台进入后台");
}

 

### iOS 开发中使用 Objective-C 配置 LaunchScreen.storyboard 的方法 为了在 iOS 应用程序中正确配置 `LaunchScreen.storyboard` 作为启动页,以下是详细的说明: #### 1. 使用 Xcode 进行基础设置 在 Xcode 中,确保项目的配置满足以下条件: - 打开项目,在 **Targets** 下的 **General** 页面找到 **App Icons and Launch Images** 部分。 - 将 **Launch Screen File** 设置为 `LaunchScreen` 文件名[^2]。 #### 2. 删除旧版启动图片配置 如果之前使用的是基于资产目录(Asset Catalog)的方式加载启动图片,则需要移除这些配置以避免冲突。具体操作如下: - 转至 **Build Settings** 并搜索关键词 `asset catalog launch image set name`。 - 如果存在名为 `LaunchScreen` 或其他相关内容的字段值,请将其清空并保存[^3]。 #### 3. 编辑 LaunchScreen.storyboard 文件 通过 Interface Builder 对该 storyboard 添加自定义 UI 组件来增强视觉效果。例如可以加入应用 Logo 图片视图 (`UIImageView`) 和品牌文字标签 (`UILabel`) 等元素[^4]。 #### 4. 实现动态逻辑处理 (可选) 虽然静态展示已经完成,但如果希望进一步扩展功能比如延迟进入主界面或者显示广告等内容,则可以在 AppDelegate.m 文件中的 `-application:didFinishLaunchingWithOptions:` 方法里调用相应函数实现业务需求: ```objective-c -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; // 初始化根控制器 UIViewController *rootVC = [[UIViewController alloc] init]; rootVC.view.backgroundColor = [UIColor whiteColor]; UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:rootVC]; self.window.rootViewController = navController; [self.window makeKeyAndVisible]; // 可在此处执行额外初始化工作, 如网络请求预取数据等. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"模拟两秒后的动作"); // 动态页面跳转逻辑 [self setupStartPageView]; }); return YES; } // 自定义方法用于呈现特定内容给用户查看一段时间后再切换到主页或其他位置 -(void)setupStartPageView{ UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController* startPageVC = [storyBoard instantiateInitialViewController]; UIWindow *keyWindow = [[[UIApplication sharedApplication] delegate] window]; keyWindow.rootViewController = startPageVC; } ``` 上述代码片段展示了如何利用延时机制控制从启动画面过渡到应用程序主要区域的过程[^1]。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值