如何使用 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 市场,以便我的应用在首次启动时收到它?

Foundation 兜风仅在首次加载问题时启动

iOS 8 和 Cordova:应用程序在首次启动时立即请求推送通知权限

React Native 应用程序在首次启动时询问 iOS 位置权限,但 0 引用内部任何位置的地理/位置代码

应用程序在首次启动后关闭