【问题标题】:IOS - How to jump between viewControllers in different scenariosIOS - 如何在不同场景下的viewControllers之间跳转
【发布时间】:2017-02-15 10:30:02
【问题描述】:

我有 5 个视图控制器(A、B、C、D、E),所有这些视图控制器都以编程方式连接,我可以在它们之间成功推送和弹出。

使用:

   navigationController?.pushViewController(loginVc, animated: true)
_ = navigationController?.popViewController(animated: true)

注意: ViewController A 首先作为默认初始 viewController 出现。

现在,我想要的是,当用户安装应用程序时,只有第一次 viewController A 必须显示为初始 viewController,其余时间打开应用程序时,viewController D 必须是初始viewController 从那里我应该能够在以前的 viewControllers 之间跳转。我该如何实现这一点。我正在使用 Xcode 8.2、Swift 3.0

提前致谢。

【问题讨论】:

  • 你的? only for the first time the viewController A must be shown as the initial viewController, rest of the times when the App is opened 有答案。显示你尝试过的代码
  • 您需要简单地定义您的 navigationController 的 rootViewController,然后才能在 AppDelegate didFinishLaunching 方法中看到应用。
  • 我很抱歉没有提供代码。这背后是有原因的。我认为这个解释足够清楚,可以给我一个解决方案,我是从 Florensvb 那里得到的。其他一些答案也有帮助。感谢stackoverflow社区:)

标签: ios swift uiviewcontroller navigation


【解决方案1】:

为此,您只需使用以下代码向您的 NSUserDefaults 添加一个布尔值:

    let defaults = UserDefaults.standard
    if (!defaults.bool(forKey: "firstTime")) { //will be false if does not exist yet
         navigationController?.pushViewController(yourDesiredVC, animated: true) //push desired vc
         defaults.set(true, forKey: "firstTime") //set the key so it never executes again
   } else {
       navigationController?.pushViewController(yourDesiredVC, animated: true) //push the other vc  
   }

【讨论】:

  • 我希望这会奏效。添加此代码的正确位置是什么?
  • @KarthikeyanSk 嘿,把它放在你想要推送到新视图控制器的地方!
  • 我希望它在第二次启动应用程序时自动推送到导航堆栈中的第三或第四个 viewController。所以我认为它不能放在任何按钮方法中。
  • @KarthikeyanSk 我没有说任何关于按钮的事情。只需在加载初始视图控制器的位置添加此代码。也就是说,在 AppDelegate 中的 applicationFinishedLaunching
【解决方案2】:

如果没有一些代码,您的问题并没有真正说明太多,但一个建议(考虑到问题的当前质量)是使用UserDefaults。将您当前版本的应用程序添加到名为 e.g. 的密钥中。 LatestVersion。在启动时将其与应用程序当前版本进行比较,如果它们不匹配,则显示ViewControllerA,如果不匹配则显示ViewControllerB

另一种方法是保存launchedForFirstTime。如果未设置显示ViewControllerA,则上述内容将考虑到您可能希望显示该视图的应用程序的未来版本。

【讨论】:

    【解决方案3】:

    您可以在 UserDefaults 中保留一个值来跟踪返回的用户并检查它是否存在:

     if let returning :Bool = UserDefaults.standard.bool(forKey: "initial_controller_shown") {
        //returning user flow
       }  else {
        //new user flow
       }
    

    一个常见的检查位置是在 applicationDidBecomeActive 或 didFinishLaunchingWithOptions

    【讨论】:

    • 如果你在applicationDidBecomeActive中添加了,当用户返回任何状态时,它都会被调用,
    【解决方案4】:

    当您的应用程序第一次启动时,使用一个标志并在其中存储一些值,以便下次您的应用程序运行时,您可以检查用户是否第一次访问该应用程序.. 之后转到appDelegate 并将以下代码粘贴到 DidFinishLaunchingWithOption...

    if yourFlag == true
    {     
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "MainStoreyBoard", bundle: nil)
         let controller = mainStoryboard.instantiateViewController(withIdentifier: "StoreyBoardIdofYourViewController") as! UINavigationController
    
         self.window?.rootViewController = controller
    }
    

    这将启动 D viewcontroller .....

    【讨论】:

      【解决方案5】:

      您可以在您的应用程序delegate.m 文件中检查它是否第一次安装的应用程序 ViewController A 将显示为初始视图控制器,否则视图控制器 D。在以下函数中检查它:

      func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
      //check the initial view controller here//
              return true
          }
      

      Swift 3:

      let launchBefore = UserDefaults.standard.bool(forKey: "launchBefore")
      if launchBefore  {
          print("Not first launch.") } else {
          print("First launch, setting UserDefault.")
          UserDefaults.standard.set(true, forKey: "launchBefore") }
      

      【讨论】:

        【解决方案6】:

        您使用的是一个导航控制器,因此很难实现您的行为。您可以更轻松地为视图 A 和 D 使用单独的视图控制器并使用以下方法调用它们:

        present(vc, animated: true)
        

        并关闭呼叫:

        dismiss(animated: true)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-21
          • 1970-01-01
          • 2016-01-19
          相关资源
          最近更新 更多