如何使 uiviewcontroller 在应用程序的第一个 运行 期间仅可见一次(例如教程)?

how can I make the uiviewcontroller visible only once during first run of the app (e.g. tutorial)?

我正在创建一个 iOS swift 应用程序,我想在用户 运行 首次使用该应用程序时显示教程屏幕。稍后,应用程序的每个 运行 教程应该被隐藏,另一个视图控制器应该是可见的作为起点。到目前为止,我的故事板看起来像这样:

它包含两个屏幕的教程(第一个和最后一个)和标签栏(这是我的应用程序的主要 window)。

至于现在,在情节提要中我选择了标签栏作为初始视图控制器:

采用这种方法,教程屏幕就再也看不到了。我如何才能在第一次启动应用程序时只显示一次,然后在用户每次打开应用程序时跳过它?

AppDelegatedidFinishLaunchingWithOptions 方法中,像这样检查 NSUserDefaults 值。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {

    let defaults = NSUserDefaults.standardUserDefaults()
    if defaults.objectForKey("isFirstTime") == nil {
         defaults.setObject("No", forKey:"isFirstTime")
         let storyboard = UIStoryboard(name: "main", bundle: nil) //Write your storyboard name
         let viewController = storyboard.instantiateViewControllerWithIdentifier("ViewController") as! ViewController
         self.window.rootViewController = viewController 
         self.window.makeKeyAndVisible()
    }
    return true
}

注意: 我已经创建了 ViewController 的对象,您需要创建 FirstPage 教程屏幕的对象,然后将其分配给 rootViewController .

对于 swift 4 进行这些更改。

let defaults = UserDefaults.standard
if defaults.object(forKey: "isFirstTime") == nil {
    defaults.set("No", forKey:"isFirstTime")
    defaults.synchronize()
    ...
}

此答案的简化 Swift 4 版本。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {

    if !UserDefaults.standard.bool(forKey: "didSee") {
         UserDefaults.standard.set(true, forKey: "didSee")

         let storyboard = UIStoryboard(name: "Main", bundle: nil) 
         let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewController")
         self.window?.rootViewController = viewController 
         self.window?.makeKeyAndVisible()
    }

    return true
}

添加这个是Scene Delegate

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let _ = (scene as? UIWindowScene) else { return }
    
    if UserDefaults.standard.bool(forKey: "introLaunched") == false{
        UserDefaults.standard.set(true, forKey: "introLaunched")
        let storyboard = UIStoryboard(name: "Main", bundle: .main)
        let vc = storyboard.instantiateViewController(identifier: "IntroScreenViewController") as! IntroScreenViewController
        self.window?.rootViewController = UINavigationController(rootViewController: vc)
    } else {
        let storyboard = UIStoryboard(name: "Main", bundle: .main)
        let vc = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
        self.window?.rootViewController = UINavigationController(rootViewController: vc)
    }
}