使用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)典教程推薦
- 更新近百篇SwiftUI教程《SwiftUI2020教程》
- 幫您突破數(shù)據(jù)存儲(chǔ)難關(guān)《SwiftUI vs CoreData數(shù)據(jù)存儲(chǔ)解決方案》
技術(shù)源碼推薦
推薦文章
CoreData篇
- SwiftUI數(shù)據(jù)存儲(chǔ)之做個(gè)筆記App 新增與查詢(CoreData)
- SwiftUI進(jìn)階之存儲(chǔ)用戶狀態(tài)實(shí)現(xiàn)登錄與登出
- SwiftUI 數(shù)據(jù)之List顯示Sqlite數(shù)據(jù)庫(kù)內(nèi)容(2020年教程)
Combine篇
TextField篇
- 《SwiftUI 一篇文章全面掌握TextField文本框 (教程和全部源碼)》
- 《SwiftUI實(shí)戰(zhàn)之TextField風(fēng)格自定義與formatters》
- 《SwiftUI實(shí)戰(zhàn)之TextField如何給鍵盤增加個(gè)返回按鈕(隱藏鍵盤)》
- 《SwiftUI 當(dāng)鍵盤出現(xiàn)時(shí)避免TextField被遮擋自動(dòng)向上移動(dòng)》
- 《SwiftUI實(shí)戰(zhàn)之TextField如何給鍵盤增加個(gè)返回按鈕(隱藏鍵盤)》
JSON文件篇
一篇文章系列
- SwiftUI一篇文章全面掌握List(教程和源碼)
- 《SwiftUI 一篇文章全面掌握TextField文本框 (教程和全部源碼)》
- SwiftUI一篇文章全面掌握Picker,解決數(shù)據(jù)選擇(教程和源碼)
- SwiftUI一篇文章全面掌握Form(教程和源碼)
- SwiftUI Color 顏色一篇文章全解決
技術(shù)交流
QQ:3365059189
SwiftUI技術(shù)交流QQ群:518696470
- 請(qǐng)關(guān)注我的專欄icloudend, SwiftUI教程與源碼
http://www.itdecent.cn/c/7b3e3b671970