【问题标题】:Following a segue to a view controller from appdelegate从 appdelegate 转到视图控制器
【发布时间】:2017-04-11 20:13:55
【问题描述】:

从应用程序委托转到视图控制器的正确方法是什么?当我收到推送通知时,我正在将用户转换到视图控制器,但是,视图并不完整。导航栏看起来不正确。这是我的设置:

tabviewcontroller (storyboard name is 'main')
 - nav1controller -> view1controller -? view1detailcontroller (storyboard name is 'view1detail')
 - nav2controller -> ...

当推送通知到达时,我想将用户带到 veiw1detailcontroller。我想让用户回到 view1controller。

这是我的代码:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let mainViewController = storyboard.instantiateViewControllerWithIdentifier("main") as! UIViewController

let view1detailcontroller = storyboard.instantiateViewControllerWithIdentifier("view1detail") as! view1detailcontroller

let nav = UINavigationController(rootViewController: mainViewController)
nav.pushViewController(view1detailcontroller, animated: true)
self.window!.rootViewController = nav

因此,它可以很好地过渡到 view1detailcontroller。但是,一旦我回到 view1controller,该屏幕和所有其他屏幕上的导航栏都显示为“主”,并且所有导航项也都丢失了。

我做错了什么?

【问题讨论】:

  • 这个有什么用nav.pushViewController(view1detailcontroller, animated: true)
  • 我需要转换到 view1detailcontroller

标签: ios swift2 segue uistoryboard


【解决方案1】:

通过创建一个新的导航控制器并设置self.window!.rootViewController = nav,您基本上是在重置整个视图堆栈。 (例如,您将失去第一个视图层次结构引用中提到的tabviewcontroller

相反,访问现有的选项卡视图控制器和它的子导航控制器来推送您的新视图控制器。如果您需要更多关于如何完成此操作的帮助,您需要分享更多代码/故事板屏幕截图以了解您现有的设置。

编辑

从您的 cmets 看来(虽然不是很清楚),您的 self.wondow.rootViewController 已经是您的“tabBarController”,其中包含导航控制器。假设这一点,并且您知道 tabbarcontroller 中预期导航控制器的索引,您可以执行以下操作以打开具有层次结构的预期视图控制器

  1. 收到推送通知后访问 tabBaController :

    如果让tabBarController = self.window.rootViewController 为? UITabBarController

  2. 在标签栏控制器中访问导航控制器:(代码假定预期的导航控制器是第一个标签。根据您的设置更改代码中的索引)

    如果让 navController = tabBarController.viewControllers[0] 为? UITabBarController

  3. 在此导航控制器上创建一个包含您想要的所有视图控制器的数组,并使用setViewControllers 方法设置它们:

    var viewControllersArray : [UIViewController] = UIViewController; viewControllersArray.append(view1controller) viewControllersArray.append(view1detailcontroller) navController.setViewControllers(viewControllers : viewControllersArray, 动画: true)

  4. 在这里,像在代码表单故事板中一样实例化 view1controllerview1detailcontroller,并注意以下表单 setViewControllers documentation

添加到数组的最后一项成为数组的顶部项 导航栈

【讨论】:

  • 谢谢。如何访问 tabview 控制器的导航控制器?我的 tabview 控制器是这样的: var mainViewController = storyboard.instantiateViewControllerWithIdentifier("main") as UIViewController self.window?.rootViewController = mainViewController
  • 等等!在问题中,您的代码提到 main 作为您尝试推送的视图控制器的故事板标识符,并且在此评论中您说它是您的 tabviewcontroller 的标识符。是哪一个?
  • 我的故事板中选项卡视图控制器的名称是'main'。它有一个导航控制器,它有两个视图控制器(view1controller 和 view1detailcontroller)。基本上,我希望用户转到 view1detailcontroller,同时保留后退按钮和选项卡。
【解决方案2】:

您应该获取 topViewController 或 visibleController 并将所需的 viewController 推送到 topController 上,而不是直接从主 storyboard 推送视图控制器,这样它将维护您的 ViewController 堆栈,您将得到您想要的。

【讨论】:

  • 你能帮我写一些代码吗?我是新来的。谢谢!
  • 我可以写一个你应该怎么做的算法
  • 我可以像你应该做的那样编写一个算法,比如首先获取窗口 rootviewcontroller 它必须是你的 navigationController 然后在 UINavigationController 上获取 topController 如果那是 detailViewController 然后使用它并推送你的数据,否则遍历所有UINavigationController 的栈控制器的控制器并获取 detailController 的对象并使用此 VC 推送您的代码。
【解决方案3】:

你可以用这个:

    var rootViewController = self.window!.rootViewController as UINavigationController
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    var viewController = mainStoryboard.instantiateViewControllerWithIdentifier("view") as ViewController
    rootViewController.pushToViewController(viewController, animated: true)

【讨论】:

  • 这个问题是它不保留我的标签视图和导航堆栈。
  • 你可以在下一个视图控制器中设置: override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) self.navigationController?.setNavigationBarHidden(true, animated: animated) }
猜你喜欢
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 2017-10-25
  • 2017-10-23
  • 2015-10-20
  • 1970-01-01
  • 2018-12-25
  • 2016-11-13
相关资源
最近更新 更多