推送到另一个选项卡的视图控制器

Posted

技术标签:

【中文标题】推送到另一个选项卡的视图控制器【英文标题】:push to another tab's viewcontroller 【发布时间】:2017-04-21 10:47:22 【问题描述】:

当用户单击某个单元格上的按钮时(视图) 我想推到另一个标签的视图控制器

标签栏控制器 --- 导航控制器 ---- VC A --- 导航控制器 ---- VC B --- 导航控制器 ---- VC C ---- VC D

like 从 viewcontroller A 到 viewcontroller D

我试过转场

self.window?.visibleViewController?.performSegue(withIdentifier:"homeSegueDetailStatement", sender: self)

工作但没有导航栏....

我尝试创建一个导航控制器并显示,崩溃了...

if let visibleViewCtrl = UIApplication.shared.keyWindow?.visibleViewController 

            let nav = UINavigationController(rootViewController: visibleViewCtrl)
            let b = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PendingStatementVC") as! PendingStatementViewController
        nav.pushViewController(b, animated:false)
            visibleViewCtrl.present(nav, animated:true, completion:nil)
        

请帮帮我

编辑---

实际上我想将选项卡和导航更改为第二个视图控制器。 我从 collectionCell 调用这个函数,这就是为什么我必须获取当前视图控制器

编辑--- 我找到了我想要的

DispatchQueue.global().async 
        DispatchQueue.main.async 
            self.tabBarController?.selectedIndex = 2
                if let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "DetailStatementVC") as? DetailStatementViewController 

                if let navigator = self.tabBarController?.viewControllers?[2] as? UINavigationController 
                    navigator.pushViewController(controller, animated: true)
                
            
        
    

【问题讨论】:

如果你推视图控制器,那你为什么要再次展示视图控制器 你需要从 appdelegate 或 Viewcontroller 推送? 你能展示你的故事板场景吗 【参考方案1】:

使用下面的代码,您可以从 VC-A 转到 VC-D,然后您可以从 VC-D 回到 VC-C

let dViewController = self.storyboard?.instantiateViewController(withIdentifier: "DViewController") as! DViewController
let thirdTabNavController = self.tabBarController?.viewControllers?[2] as! UINavigationController
thirdTabNavController.pushViewController(dViewController, animated: false)
self.tabBarController?.selectedIndex = 2

【讨论】:

【参考方案2】:

试试这样的:

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "mainView") as! MainViewController
self.present(nextViewController, animated:true, completion:nil)

【讨论】:

【参考方案3】:

这样试试

let mainStoryboardIpad : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let MainViewControllerObj : MainViewController = mainStoryboardIpad.instantiateViewController(withIdentifier: "MainViewController") as! MainViewController
let navigationControllerObj:UINavigationController = UINavigationController.init(rootViewController: MainViewControllerObj)
self.present(navigationControllerObj, animated:true, completion:nil)

【讨论】:

【参考方案4】:

Kamil3 的答案肯定是最好的,但是如果有人需要在导航栏中的“返回”按钮旁边隐藏标题,我发现不是很优雅的解决方案,但想分享一下,因为它花了我很多时间:

guard let dViewController = 
    self.storyboard?.instantiateViewController(withIdentifier: "DViewController") as! DViewController,
    let thirdTabNavController = self.tabBarController?.viewControllers?[2] as! UINavigationController else 
  return

self.tabBarController?.selectedIndex = 2
// here what you need
thirdTabNavController.viewControllers.first?.title = " "
thirdTabNavController.pushViewController(dViewController, animated: false)

【讨论】:

【参考方案5】:
Try below code:

let mainStoryBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = mainStoryBoard.instantiateViewController(withIdentifier: "DcontrollerIdentifier") as! DViewController
 self.navigationController?.pushViewController(nextViewController, animated: true)

【讨论】:

以上是关于推送到另一个选项卡的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

选项卡栏,当来自另一个选项卡的视图控制器时弹出到根视图控制器(默认 vc)

通过远程通知从 AppDelegate 推送到 UINavigationController

将页面推送到最顶部的 NavigationPage

将 UIViewController 推送到导航堆栈时如何显示选项卡栏

从 UIView 类推送到 viewcontroller

带有选项卡式导航的 Cocoa-Touch 后退按钮