SwiftUI 2.0 能否構(gòu)建整個(gè)iOS應(yīng)用(wwdc20)

使用SwiftUI能否構(gòu)建整個(gè)iOS應(yīng)用

直到今年的發(fā)布,使用SwiftUI構(gòu)建的應(yīng)用仍需要使用Apple以前的UI框架UIKit和AppKit中的機(jī)制來(lái)實(shí)現(xiàn)其入口點(diǎn),例如使用UIApplicationDelegate定義iPhone或iPad應(yīng)用的應(yīng)用委托。

然而,今年,由于其API的一些新增功能,現(xiàn)在可以直接使用SwiftUI定義整個(gè)應(yīng)用程序。 例如,假設(shè)我們正在構(gòu)建一個(gè)播客應(yīng)用程序,該應(yīng)用程序使用TabView作為其根視圖,然后它包含三個(gè)選項(xiàng)卡-庫(kù)視圖,發(fā)現(xiàn)視圖和搜索視圖:

struct RootView: View {
    var body: some View {
        TabView {
            LibraryView()
            DiscoverView()
            SearchView()
        }
    }
}

在去年的iOS 13及其兄弟操作系統(tǒng)上,我們不得不使用UIHostingController(或在Mac上為NSHostingController)來(lái)實(shí)際呈現(xiàn)上述視圖,例如,將其分配為UIWindow的rootViewController。 但是現(xiàn)在,上面的根視圖層次結(jié)構(gòu)可以簡(jiǎn)單地嵌入符合新App協(xié)議的類型中,并通過(guò)使用Swift的新@main屬性注釋該類型,它將用作我們應(yīng)用程序的入口點(diǎn)-無(wú)需 任何應(yīng)用程序委托或任何其他引導(dǎo)代碼:

@main struct PodcastApp: App {
    var body: some Scene {
        WindowGroup {
            TabView {
                LibraryView()
                DiscoverView()
                SearchView()
            }
        }
    }
}

上面的WindowGroup類型是另一個(gè)新協(xié)議Scene的內(nèi)置實(shí)現(xiàn),它是一個(gè)本機(jī)SwiftUI,等效于去年引入的UIScene API,主要是為了使iPad應(yīng)用程序獲得多窗口支持。

雖然我們也可以創(chuàng)建自己的自定義場(chǎng)景類型,但是如果希望始終在我們所有應(yīng)用程序場(chǎng)景中呈現(xiàn)相同的視圖層次結(jié)構(gòu),那么僅使用WindowGroup是一個(gè)不錯(cuò)的選擇。

但很酷的事情是,由于SwiftUI如此可組合,即使我們選擇構(gòu)建自己的Scene,我們?nèi)匀豢梢允褂肳indowGroup來(lái)實(shí)現(xiàn)其主體,同時(shí)還提供我們自己的自定義邏輯。

例如,在這里我們?yōu)椴タ蛻?yīng)用程序構(gòu)建了一個(gè)自定義場(chǎng)景,該場(chǎng)景使用新的scenePhase環(huán)境值來(lái)觀察場(chǎng)景的整體相位何時(shí)發(fā)生變化,例如,檢測(cè)場(chǎng)景何時(shí)從活動(dòng)狀態(tài)變?yōu)榉腔顒?dòng)狀態(tài):

struct PodcastScene: Scene {
    @Environment(\.scenePhase) private var phase

    var body: some Scene {
        WindowGroup {
            TabView {
                LibraryView()
                DiscoverView()
                SearchView()
            }
        }
        .onChange(of: phase) { newPhase in
            switch newPhase {
            case .active:
                // App became active
            case .inactive:
                // App became inactive
            case .background:
                // App is running in the background
            @unknown default:
                // Fallback for future cases
            }
        }
    }
}

盡管新的App和Scene協(xié)議目前無(wú)法提供與UIKit和AppKit等效的功能和靈活性,但是某些應(yīng)用程序現(xiàn)在可以使用基于100%SwiftUI的實(shí)現(xiàn)這一事實(shí)實(shí)在是太酷了,而且 SwiftUI作為框架向前邁出了一大步。

推薦

基礎(chǔ)文章推薦

經(jīng)典教程推薦

技術(shù)源碼推薦

推薦文章

CoreData篇

Combine篇

TextField篇

JSON文件篇


一篇文章系列

技術(shù)交流

QQ:3365059189
SwiftUI技術(shù)交流QQ群:518696470

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容