使用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篇
- 《SwiftUI 一篇文章全面掌握TextField文本框 (教程和全部源碼)》
- 《SwiftUI實戰之TextField風格自定義與formatters》
- 《SwiftUI實戰之TextField如何給鍵盤增加個返回按鈕(隱藏鍵盤)》
- 《SwiftUI 當鍵盤出現時避免TextField被遮擋自動向上移動》
- 《SwiftUI實戰之TextField如何給鍵盤增加個返回按鈕(隱藏鍵盤)》
JSON文件篇
一篇文章系列
- SwiftUI一篇文章全面掌握List(教程和源碼)
- 《SwiftUI 一篇文章全面掌握TextField文本框 (教程和全部源碼)》
- SwiftUI一篇文章全面掌握Picker,解決數據選擇(教程和源碼)
- SwiftUI一篇文章全面掌握Form(教程和源碼)
- SwiftUI Color 顏色一篇文章全解決
技術交流
QQ:3365059189
SwiftUI技術交流QQ羣:518696470
- 請關注我的專欄icloudend, SwiftUI教程與源碼
https://www.jianshu.com/c/7b3e3b671970