Swift:通过 TabBar 和导航控制器以编程方式从一个视图转换到另一个视图

Posted

技术标签:

【中文标题】Swift:通过 TabBar 和导航控制器以编程方式从一个视图转换到另一个视图【英文标题】:Swift: Programmatically transitioning from 1 view to another via a TabBar and Navigation Controller 【发布时间】:2016-06-19 13:31:16 【问题描述】:

用户登录并登陆 viewNumOne,填写姓名和地址,即可看到 viewNumTwo 和 viewNumThree。他们现在注销。当他们重新登录时,我希望他们直接进入 viewColorBlue(这是我遇到问题的地方)。

(登录屏幕) 带有登录字段的视图控制器。登录后,他们会转到作为 TabBar 的 rootVC,然后他们会进入第一个选项卡 viewNumOne(这工作正常)

(根) 标签栏:

(第一个标签 - tabBar[0]) viewNumNavController > viewNumOne(名称/地址信息字段在这里)> viewNumTwo > viewNumThree

(第二个标签 - tabBar[1]) viewColorNavController > viewColorRed > viewColorBlue > viewColorWhite(注销按钮在这里)

这是我尝试过的代码,但它崩溃了:

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

let tabBarController = mainStoryboard.instantiateInitialViewController() as! UITabBarController
tabBarController.selectedIndex = 1

let viewColorNaviCon = tabBarController.viewControllers![1] as! UINavigtionController
let viewColorBlueVC = viewColorNaviCon.topViewController as! ViewColorBlueController
self.presentViewController(viewColorBlueVC, animated: true, completion: nil)

【问题讨论】:

【参考方案1】:

我花了 20 小时才弄清楚这一点,所以希望这能一直拯救其他人。您需要做的是重置 TabBar 的 Navigation Controller 的根视图控制器。

这是第一步。假设用户登陆 viewNumOne 并填写了他们的姓名和地址。假设他们正确填写了他们的姓名和地址,如果他们注销并重新登录,他们就不需要再次看到这个场景了。要呈现 vc 的新场景,您必须首先设置要更改 vc 的标签栏的导航控制器。

let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
let tabBarController = mainStoryboard.instantiateViewControllerWithIdentifier("MainTabBarController"
tabBarController.selectedIndex = 1
let viewNumNavController  = tabBarController.viewControllers![1] as! ViewNumNavigationController

这是第二步。您必须创建一个希望用户看到的新视图控制器数组。

    //Array of view controllers you want to set as the Navigation Controller's new array of VC's
let viewColorRedVC = mainStoryboard.instantiateViewControllerWithIdentifier("ViewColorRedController") as! ViewColorRedController
let viewColorBlueVC = mainStoryboard.instantiateViewControllerWithIdentifier("ViewColorBlueController") as! ViewColorBlueController
let viewColorWhiteVC = mainStoryboard.instantiateViewControllerWithIdentifier("ViewColorWhiteController") as! ViewColorWhiteController
let newArrayOfVCs = [viewColorRedVC, viewColorBlueVC, viewColorWhiteVC]

现在最后一步是使用上面的数组更改标签栏的根视图控制器。

//This method is what sets the Navigation Controller's new child views to be presented
viewNumNavController.setViewControllers(newArrayOfVCs, animated: false)
//This method is what sets the exact view controller you want use as the actual root vc (the very first scene the user will see)
viewNumNavController.popToViewController(viewColorRedVC, animated: true)
self.presentViewController(tabBarController, animated: true, completion: nil)

希望这会有所帮助!

【讨论】:

以上是关于Swift:通过 TabBar 和导航控制器以编程方式从一个视图转换到另一个视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中更改 TabBar 的颜色?图像作为导航栏中的背景?

以编程方式将 NavigationController 添加到基于 TabBar 的应用程序

swift - 指定VC隐藏导航栏 - 禁用tabbar的根控制器手势,防止两个tabbar跳转 手势冲突

Swift 以编程方式导航到另一个视图控制器/场景

Swift-以编程方式导航控制器和标签栏控制器

如何以编程方式创建标签栏控制器后添加导航界面(Swift)