使用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