【问题标题】:How to launch a tutorial on first app launch using SwiftUI?如何使用 SwiftUI 在首次应用启动时启动教程?
【发布时间】:2025-12-24 17:15:12
【问题描述】:

我想在我的 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
}

【问题讨论】:

    标签: swiftui


    【解决方案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")
    

    【讨论】: