IOS-如何在不同场景中在ViewController之间跳转

IOS-如何在不同场景中在ViewController之间跳转,ios,swift,uiviewcontroller,navigation,Ios,Swift,Uiviewcontroller,Navigation,我有5个viewControllersA、B、C、D、E,所有这些viewControllers都是通过编程连接的,我可以在它们之间成功地推送和弹出 使用: navigationController?.pushViewController(loginVc, animated: true) _ = navigationController?.popViewController(animated: true) 注意:ViewController A首先显示为默认初始ViewControlle

我有5个viewControllersA、B、C、D、E,所有这些viewControllers都是通过编程连接的,我可以在它们之间成功地推送和弹出

使用:

   navigationController?.pushViewController(loginVc, animated: true)
_ = navigationController?.popViewController(animated: true)
注意:ViewController A首先显示为默认初始ViewController

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


提前感谢。

要做到这一点,您只需使用以下代码向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  
   }

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


另一种方法是第一次保存LaunchedFor。如果未设置show ViewControllerA,则上述内容将考虑应用程序的未来版本,在这些版本中,您可能也希望显示该视图。

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

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

检查这一点的常见位置是应用程序IDBecomeActive或didFinishLaunchingWithOptions

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

present(vc, animated: true)
并取消通话:

dismiss(animated: true)

首次启动应用程序时,请使用标志并在其中存储一些值,以便下次运行应用程序时,您可以检查用户是否首次访问应用程序。。然后转到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…..

您可以在app delegate.m文件中检查第一次安装的app viewcontroller A是否显示为初始视图控制器,或者查看控制器D。在以下功能中检查它:

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


你的只有在第一次必须将viewController A显示为初始viewController时,应用程序打开时的其余时间才有答案。显示您尝试过的代码在应用程序在AppDelegate didFinishLaunching方法中可见之前,您需要简单地定义navigationController的rootViewController。对于没有提供代码,我深表歉意。这是有原因的。我认为这个解释足够清楚,可以给我一个解决方案,我从弗洛伦斯得到了它。很少有其他答案也有帮助。多亏了stackoverflow社区:如果您添加了ApplicationIDBecMeactive,当任何用户返回任何状态时,它都将被调用,我希望这会起作用。什么是添加此代码的正确位置?@KarthikeyanSk嘿,放在你想要推到新视图控制器的位置!我希望从第二次启动应用程序时,它会自动推送到导航堆栈中的第三个或第四个viewController。所以我认为它不能放在任何按钮方法中。@KarthikeyanSk我没有说任何关于按钮的事情。只需在加载初始视图控制器的位置添加此代码。换句话说,在ApplicationFinished中,在AppDelegate中启动
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") }