在 Swift 中以编程方式从主 TabBarController 转到嵌套的 ViewController

Go to a nested ViewController from a main TabBarController programmatically in Swift

我有以下 ViewController 结构,见下图。

每当我想从 ViewController 1 移动到我使用的任何其他主控制器时 self.tabBarController?.selectedIndex = indexNumber

// for instance, this would take me to ViewController 3
self.tabBarController?.selectedIndex = 2

根据下图,当在 ViewController 1 中点击按钮时,如何以编程方式从 ViewController 1 转到 TargetViewController

仅供参考 - 在下图中,我在 ViewController 3 中显示了一个按钮,这只是为了显示情节提要结构,实际的按钮点击将发生在 ViewController 1

编辑:

根据 Prashant Tukadiya 的回答,这是你如何做的。

ViewController 1

ViewController 1 中,在您的点击事件中添加以下内容。

    self.tabBarController?.selectedIndex = 2
    let nav = (self.tabBarController?.viewControllers?[2] as? UINavigationController)
    let vc =  TargetViewController.viewController()
    nav?.pushViewController(vc, animated: true)

目标ViewController

  1. 在您的 TargetViewController 中添加以下 class 方法。

    class func viewController() -> 目标ViewController { 让故事板 = UIStoryboard(名称:"Main",包:无) return storyboard.instantiateViewController(withIdentifier: "targetViewControllerID") 为!目标ViewController }

  2. 在故事板 ID 字段中添加 targetViewControllerID

您可以直接从 Storyboard 中为 TargetViewController 指定标识符,然后从 Storyboard 中加载并推送或呈现它。

喜欢在你的 TargetViewController

中添加此方法
class func viewController () ->  TargetViewController {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    return storyboard.instantiateViewController(withIdentifier: "yourIdentifer") as! TargetViewController
}

和点击事件

     let vc =  TargetViewController.viewController()

    self.navigationController?.pushViewController(vc, animated: true)

编辑

看完评论后对你的要求有了清晰的认识

ViewController1 的按钮操作上,您想要转到 TargetViewController,但是当按下返回时您想要返回到 viewController 3

Select 特定索引优先

   self.tabBarController?.selectedIndex = 2

之后需要抓取UINavigationController

let nav = (self.tabBarController?.viewControllers?[2] as? UINavigationController)

然后推送 ViewController

    let vc =  TargetViewController.viewController()

    nav?.pushViewController(vc, animated: true)

注意:不要忘记将标识符添加到故事板到 TargetViewController 并将 class func viewController () -> TargetViewController 方法添加到目标 ViewController

希望对您有所帮助

在ViewController1中的一个按钮的动作函数中,你可以这样使用:

     func presentMethod(storyBoardName: String, storyBoardID: String) {
        let storyBoard: UIStoryboard = UIStoryboard(name: storyBoardName, bundle: nil)
        let newViewController = storyBoard.instantiateViewController(withIdentifier: storyBoardID)
        self.definesPresentationContext = true
        self.present(newViewController, animated: true, completion: nil)
    }

//usage

 presentMethod(storyBoardName: "Main", storyBoardID: "TargetViewController") 

几天前我也遇到过同样的问题,最后我找到了解决方案,也许这会对你有所帮助。

    TabController.shared.tabcontroller.selectedIndex = 1
    let navigation  = TabController.shared.tabcontroller.selectedViewController?.navigationController

    let SavedAddress = self.storyboard?.instantiateViewController(withIdentifier: "SavedAddressVC") as! SavedAddressVC
    navigation?.pushViewController(SavedAddress, animated: true)

我用过同样的解决方案。这是我的工作代码。