【问题标题】: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 中使用该启动检测代码时,它才无法导航。

标签: ios swift uiviewcontroller uinavigationcontroller


【解决方案1】:

在应用委托中执行此操作

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

而不是

self.window?.rootViewController = initialViewController

【讨论】:

  • 这可行,但它正在创建一个导航栏,我们如何删除它?
  • 这完全是一个问题,但无论如何,self.navigationController?.navigationBar.isHidden = true
猜你喜欢
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多