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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。