SwiftUI 2.0 能否構建整個iOS應用(wwdc20)

使用SwiftUI能否構建整個iOS應用

直到今年的發佈,使用SwiftUI構建的應用仍需要使用Apple以前的UI框架UIKit和AppKit中的機制來實現其入口點,例如使用UIApplicationDelegate定義iPhone或iPad應用的應用委託。

然而,今年,由於其API的一些新增功能,現在可以直接使用SwiftUI定義整個應用程序。 例如,假設我們正在構建一個播客應用程序,該應用程序使用TabView作爲其根視圖,然後它包含三個選項卡-庫視圖,發現視圖和搜索視圖:

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

在去年的iOS 13及其兄弟操作系統上,我們不得不使用UIHostingController(或在Mac上爲NSHostingController)來實際呈現上述視圖,例如,將其分配爲UIWindow的rootViewController。 但是現在,上面的根視圖層次結構可以簡單地嵌入符合新App協議的類型中,並通過使用Swift的新@main屬性註釋該類型,它將用作我們應用程序的入口點-無需 任何應用程序委託或任何其他引導代碼:

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

上面的WindowGroup類型是另一個新協議Scene的內置實現,它是一個本機SwiftUI,等效於去年引入的UIScene API,主要是爲了使iPad應用程序獲得多窗口支持。

雖然我們也可以創建自己的自定義場景類型,但是如果希望始終在我們所有應用程序場景中呈現相同的視圖層次結構,那麼僅使用WindowGroup是一個不錯的選擇。

但很酷的事情是,由於SwiftUI如此可組合,即使我們選擇構建自己的Scene,我們仍然可以使用WindowGroup來實現其主體,同時還提供我們自己的自定義邏輯。

例如,在這裏我們爲播客應用程序構建了一個自定義場景,該場景使用新的scenePhase環境值來觀察場景的整體相位何時發生變化,例如,檢測場景何時從活動狀態變爲非活動狀態:

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協議目前無法提供與UIKit和AppKit等效的功能和靈活性,但是某些應用程序現在可以使用基於100%SwiftUI的實現這一事實實在是太酷了,而且 SwiftUI作爲框架向前邁出了一大步。

推薦

基礎文章推薦

經典教程推薦

技術源碼推薦

推薦文章

CoreData篇

Combine篇

TextField篇

JSON文件篇


一篇文章系列

技術交流

QQ:3365059189
SwiftUI技術交流QQ羣:518696470

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章