设置根视图控制器,然后以编程方式导航到下一个视图

Posted

技术标签:

【中文标题】设置根视图控制器,然后以编程方式导航到下一个视图【英文标题】:Setting rootViewController then navigate to next view programatically 【发布时间】:2016-07-03 17:32:44 【问题描述】:

最初我在登录后有一个层次结构

-> MyCoursesViewController
 -> CourseInfo UITabBarController

如果用户关闭应用程序,然后重新进入,rootViewController 将是正确的 CourseInfo UITabBarController。但是,当用户需要查看不同的课程(退出课程)时,他们无法“返回”到 MyCoursesViewController,因为它不再在堆栈中。

在 AppDelegate 中:

if (inCourse) 
  let storyboard : UIStoryboard = UIStoryboard(name: “Main”, bundle: nil)
  let courseInfoTabController = storyboard.instantiateViewControllerWithIdentifier(“CourseInfo”) as! UITabBarController
  self.window?.rootViewController = courseInfoTabController
 else 
  let storyboard : UIStoryboard = UIStoryboard(name: “Main”, bundle: nil)
  let myCoursesViewController = storyboard.instantiateViewControllerWithIdentifier(“MyCourses”)
  self.window?.rootViewController = myCoursesViewController

有什么方法可以将 MyCoursesViewController 作为 rootViewController,然后自动导航到 Course Info UITabBarController,这样 MyCoursesViewController 就在层次结构中,以防他们回击(退出课程)?

或者,如果用户退出课程(回击),我们以某种方式删除 rootViewController 并用新的 rootViewController 替换会更好吗?另一种选择是,如果我们只是替换 rootViewController,旧的会从内存中释放出来还是仍然在某个地方引用?

例如

CourseInfo UITabBarController 目前仍是 rootViewController 但现在我们将其换成新的

 let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
 let myCoursesViewController = mainStoryBoard.instantiateViewControllerWithIdentifier(“MyCourses”) as! ViewController
 let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
 appDelegate.window?.rootViewController = myCoursesViewController 

【问题讨论】:

在您的应用程序委托中,您可以设置您的层次结构(在 setViewController 上,您将放置您想要的顺序,这里我使用虚拟控制器):let navigationBar = UINavigationController() navigationBar.setViewControllers([UIViewController()], animated: false) self.window?.rootViewController = navigationBar 【参考方案1】:

在您的 AppDelegate 中,您可以设置您的层次结构。尝试类似:

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

    let myCoursesViewController = storyboard.instantiateViewControllerWithIdentifier(“MyCourses”)

    if isInCourse
        let courseInfoTabController = storyboard.instantiateViewControllerWithIdentifier(“CourseInfo”) as! UITabBarController
        let navigationBar = UINavigationController()
        navigationBar.setViewControllers([myCoursesViewController,courseInfoTabController], animated: false)
        self.window?.rootViewController = navigationBar
    else
        self.window.rootViewController = myCoursesViewController
           

【讨论】:

以上是关于设置根视图控制器,然后以编程方式导航到下一个视图的主要内容,如果未能解决你的问题,请参考以下文章

当以编程方式设置根视图控制器时,导航和标签栏丢失

以编程方式更改导航根视图目标 c

如何以编程方式设置根视图控制器?

以编程方式设置为根视图控制器时,视图控制器无法正确显示子视图

如何以编程方式返回具有全局功能的根视图控制器?

以编程方式创建的 rootviewcontroller 未显示分配的 viewcontroller 的内容