【问题标题】:how can I make the uiviewcontroller visible only once during first run of the app (e.g. tutorial)?如何使 uiviewcontroller 在应用程序首次运行期间仅可见一次(例如教程)?
【发布时间】:2017-01-14 03:23:54
【问题描述】:

我正在创建一个 iOS swift 应用程序,我想在用户第一次运行该应用程序时显示教程屏幕。稍后,随着应用程序的每次运行,教程应该被隐藏,另一个视图控制器应该作为起点可见。到目前为止,我的情节提要如下所示:

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

就目前而言,在故事板中,我选择标签栏作为初始视图控制器:

通过这种方法,教程屏幕永远不会出现。如何在首次启动应用时仅显示一次,然后在每次用户打开应用时跳过它?

【问题讨论】:

  • 好的,谢谢你的建议!但是如何根据 bool 标志决定是否显示屏幕?我应该从哪里做呢?
  • 您可以签入您的应用委托,然后在那里设置根视图控制器。
  • @ChrisSlowik 你能给我看一个我可以使用的代码示例吗?我尝试使用:let vc : AnyObject! = self.storyboard!.instantiateViewControllerWithIdentifier("tutorialFirst") self.showViewController(vc as! UIViewController, sender: vc),但我的屏幕没有改变

标签: ios swift uiviewcontroller uistoryboard


【解决方案1】:

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

【讨论】:

  • 嗯,我在这里遇到错误:let viewController = self.storyboard? 说“'AppDeleage' 类型的值没有成员'故事板'
  • 我认为你不需要打电话给defaults.synchronize
  • @LalKrishna 是的,现在我们不需要在每次更新或设置 UserDefaults 中的值时调用同步方法,它会自动同步
【解决方案2】:

对于 swift 4 进行这些更改。

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

【讨论】:

    【解决方案3】:

    此答案的简化 Swift 4 版本。

    https://stackoverflow.com/a/39353299/1565913

    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
    }
    

    【讨论】:

      【解决方案4】:

      添加这是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)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-22
        • 2023-03-09
        • 2015-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多