为啥我们不能在以编程方式设置初始视图控制器时以编程方式在视图控制器之间跳转?

Posted

技术标签:

【中文标题】为啥我们不能在以编程方式设置初始视图控制器时以编程方式在视图控制器之间跳转?【英文标题】:Why couldn't we programmatically jump between viewControllers while programmatically setting up the initial viewController?为什么我们不能在以编程方式设置初始视图控制器时以编程方式在视图控制器之间跳转? 【发布时间】:2017-03-09 10:15:53 【问题描述】:

我只使用了两个视图控制器,比如viewControllerAviewControllerB。通过在AppDelegate.swift中使用如下代码,当App第一次启动时,将viewControllerA设置为初始viewController,从第二次开始,viewControllerB将设置为初始viewController。

class AppDelegate: UIResponder, UIApplicationDelegate 
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

    let defaultss = UserDefaults.standard
    if (!defaultss.bool(forKey: "firstTimes"))   
        self.window = UIWindow(frame: UIScreen.main.bounds)

        let storyboard = UIStoryboard(name: "Main", bundle: nil)

        let initialViewController = storyboard.instantiateViewController(withIdentifier: "ViewControllerA")

        self.window?.rootViewController = initialViewController
        self.window?.makeKeyAndVisible()

    defaultss.set(true, forKey: "firstTimes") //set the key so it never executes again
     else
    

        self.window = UIWindow(frame: UIScreen.main.bounds)

        let storyboard = UIStoryboard(name: "Main", bundle: nil)

        let initialViewController = storyboard.instantiateViewController(withIdentifier: "ViewControllerB")

        self.window?.rootViewController = initialViewController
        self.window?.makeKeyAndVisible()
    
     return true


它工作正常。但是,如果我使用此代码,则无法使用以下代码以编程方式在视图控制器之间从 A 跳转到 BBA

import UIKit

class ViewControllerA: UIViewController 


    override func viewDidLoad()
    
        super.viewDidLoad()
    

    @IBAction func buttonA(_ sender: Any)
    
            let ViewControllerB = storyboard?.instantiateViewController(withIdentifier: "ViewControllerB") as! ViewControllerB
            navigationController?.pushViewController(ViewControllerB, animated: true)
    




import UIKit

class ViewControllerB: UIViewController 

    override func viewDidLoad()
    
        super.viewDidLoad()

    


    @IBAction func buttonB(_ sender: Any)
    
         let ViewControllerA = storyboard?.instantiateViewController(withIdentifier: "ViewControllerA") as! ViewControllerA
            navigationController?.pushViewController(ViewControllerA, animated: true)
    


我怎样才能同时实现,我应该能够检测到第一次启动并设置初始 viewController,我也应该能够以编程方式在 viewController 之间跳转。

我使用的是 Xcode 8.2、Swift 3.0。

提前致谢。

【问题讨论】:

在将 UIViewController 设置为初始视图控制器作为根视图控制器之前将它们添加到 UINavigationController 中。 什么意思? @Dev_Tandel 查看@rv7284 的回答:这就是我的意思。 如果你想在视图控制器之间跳转,它们应该在导航控制器中。 这是第一步,我做到了。它也会导航到其他 viewController。问题是,只有当我在 AppDelegate.swift 中使用该启动检测代码时,它才无法导航。 【参考方案1】:

在应用委托中执行此操作

let navC = UINavigationController(rootViewController: initialViewController)
self.window?.rootViewController = navC

而不是

self.window?.rootViewController = initialViewController

【讨论】:

这可行,但它正在创建一个导航栏,我们如何删除它? 这完全是一个问题,但无论如何,self.navigationController?.navigationBar.isHidden = true

以上是关于为啥我们不能在以编程方式设置初始视图控制器时以编程方式在视图控制器之间跳转?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法在 AppDelegate 中以编程方式更改我的初始视图控制器?

在 UIButton 单击时以编程方式创建 Segue 或推送到另一个视图控制器

iOS如何在弹出顶视图控制器时以编程方式检测?

在运行时以编程方式激活约束

以编程方式设置初始视图控制器 Swift

在需要时以编程方式添加滚动