为啥我们不能在以编程方式设置初始视图控制器时以编程方式在视图控制器之间跳转?
Posted
技术标签:
【中文标题】为啥我们不能在以编程方式设置初始视图控制器时以编程方式在视图控制器之间跳转?【英文标题】:Why couldn't we programmatically jump between viewControllers while programmatically setting up the initial viewController?为什么我们不能在以编程方式设置初始视图控制器时以编程方式在视图控制器之间跳转? 【发布时间】:2017-03-09 10:15:53 【问题描述】:我只使用了两个视图控制器,比如viewControllerA
和viewControllerB
。通过在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
跳转到 B
或 B
到 A
。
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 中以编程方式更改我的初始视图控制器?