Day08 SwiftUI 01 - Life Cycle : UIKit App Delegate

在 2019 年时,Apple 推出了两套强大的框架分别是 SwiftUI 以及 Combine,而这两种全新的框架对於开发者来说是一个重大的改动,它也跟以往iOS 开发者熟悉的开发方式不同

SwiftUI 是用来替换原IOS 的UIKit 和macOS 的APPKit 的UI 框架,特性是声明式的程序设计

Combine 为Apple 新推出的 FRP (Functional Reactive Programming ,函数式响应式程序设计) 框架,为应用程序处理事件提供了一种声明性的方法,将在之後做详细介绍

以下我们就来建立SwiftUI 的专案

Life Cycle - UIKit App Delegate

首先我们在Xcode 新建专案,并选择SwiftUI 作为Interface,Life Cycle 这边先选UIKit App Delegate,如下图

https://ithelp.ithome.com.tw/upload/images/20210923/20118479WRD1nLvB4x.png

新建完成後,我们一样来看一下它自动产生的档案,来跟前面的UIKit 专案比较,发现Main.storyboard 不见了!

我们来看看SceneDelegate,正如我们之前讨论的,SceneDelegate 负责设置您应用中的场景,以及设置首个页面,而scene(_:willConnectTo:options:)在SwiftUI 时改为如下:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Create the SwiftUI view that provides the window contents.
        let contentView = ContentView()

        // Use a UIHostingController as window root view controller.
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView)
            self.window = window
            window.makeKeyAndVisible()
        }
    }

上面的这段修改做了什麽呢?

  • 首先,必须我们知道在将新场景添加到应用程序中後会调用scene(_:willConnectTo:options:)函数方法。它提供了一个scene物件(和一个session)。其中UIScene 的实例化物件scene实际上是UIWindowScene类型的物件,而这个UIWindowScene物件是由应用程序创建的
  • window属性会在这里用到。应用程序仍然使用UIWindow物件,但现在它们已成为 scene(场景)的一部分。在if let代码块中可以清楚看到如何使用scene来初始化UIWindow物件
  • 为 SwiftUI 项目创建ContentView实例,并通过使用UIHostingController将其添加为根视图控制器rootViewController。该控制器用於将基於SwiftUI 的视图显示在画面上
  • 设置windowrootViewController,将window实例分配给了场景的window属性,并且设置窗口makeKeyAndVisible为true,即将该窗口置於App的前面

以上动作也就是当scene(_:willConnectTo:options:)被调用时,SceneDelegate会在正确的时间配置场景,在scene(_:willConnectTo:options :)函数内,会创建一个SwiftUI 视图(ContentView),将其放置在UIHostingController控制器中,然後将控制器分配给窗口的根视图控制器,并将该窗口放置在应用程序UI 前面,接下来就可以去看ContentView来设计画面了


<<:  [13th][Day13] slice

>>:  再次尝试的汇率爬虫

电子书阅读器上的浏览器 [Day07] 改善更多的 UI

在 Day02 时有提到,电子纸萤幕设备上的 UI 设计原则是减少画面的重绘。我们可以看到上面图中...

Day30 把同学变成刘德华 他需要几杯忘情水

之前有提到EyeJack可以拿来做明信片,但EyeJack除了可以做明信片外,也很适合用来写日记,只...

学习Python纪录Day29 - 简易版会飞的小鸟

铁人赛学习纪录来到了第28天,今天想来做点轻松的,决定用python做一只会飞的小鸟 首先大概设计一...

抓取资料库数据 - SQL进阶语法

今天终於来到SQL的进阶篇!想要更加灵活的使用SQL,就必须要知道子查询的用法,今天就让我们来认识所...

[Day 28 - 小试身手] Todolist with React (3)

在上一章Todolist with React (2),完成所有样式设定後,现在就让我们在 Rea...