如何使用 SwiftUI 在首次应用启动时启动教程?
Posted
技术标签:
【中文标题】如何使用 SwiftUI 在首次应用启动时启动教程?【英文标题】:How to launch a tutorial on first app launch using SwiftUI? 【发布时间】:2019-10-29 21:45:41 【问题描述】:我想在我的 SwiftUI 应用首次启动时启动一个教程。这段代码应该在项目中的什么位置以及如何在应用首次启动时启动教程(它只是一个 SwiftUI 视图)?
我已经知道如何在使用 UserDefaults 之前检查应用程序是否已启动。我想知道如何启动 SwiftUI 视图,然后在用户完成教程后如何启动标准 ContentView。
let hasLaunchedBefore = UserDefaults.standard.bool(forKey: "hasLaunchedBefore")
if hasLaunchedBefore
// Not first launch
// Load ContentView here
else
// Is first launch
// Load tutorial SwiftUI view here
UserDefaults.standard.set(true, forKey: "hasLaunchedBefore") // Set hasLaunchedBefore key to true
【问题讨论】:
【参考方案1】:试着把它放在你的场景中
let hasLaunchedBefore = UserDefaults.standard.bool(forKey: "hasLaunchedBefore")
let content = ContentView()
let tutorial = TutorialView()
if let windowScene = scene as? UIWindowScene
let window = UIWindow(windowScene: windowScene)
if hasLaunchedBefore
window.rootViewController = UIHostingController(rootView: content)
else
window.rootViewController = UIHostingController(rootView: tutorial)
UserDefaults.standard.set(true, forKey: "hasLaunchedBefore")
self.window = window
window.makeKeyAndVisible()
【讨论】:
第一次启动时有效,但如果我在那之后关闭应用程序并重新打开它,它就会崩溃。 没关系,我忘记将我的一个环境对象添加回内容视图。感谢您的帮助!【参考方案2】:在您的SampleApp
中,在 SwiftUI 2.0 之后:
import SwiftUI
@main
struct SampleApp: App
@AppStorage("didLaunchBefore") var didLaunchBefore: Bool = true
let persistenceController = PersistenceController.shared
var body: some Scene
WindowGroup
if didLaunchBefore
SplashView()
else
ContentView()
然后在SplashView
中添加一个具有如下操作的按钮:
UserDefaults.standard.set(false, forKey: "didLaunchBefore")
【讨论】:
以上是关于如何使用 SwiftUI 在首次应用启动时启动教程?的主要内容,如果未能解决你的问题,请参考以下文章
Swift Scene Delegate 在首次启动时不运行代码
是否可以将自定义参数传递给 android 市场,以便我的应用在首次启动时收到它?
iOS 8 和 Cordova:应用程序在首次启动时立即请求推送通知权限