【问题标题】:Go to a nested ViewController from a main TabBarController programmatically in Swift在 Swift 中以编程方式从主 TabBarController 转到嵌套的 ViewController
【发布时间】:2019-05-07 01:51:21
【问题描述】:

我有以下 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 的回答,这是您的做法。

视图控制器 1

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

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

TargetViewController

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

    类 func viewController() -> TargetViewController { 让故事板= UIStoryboard(名称:“主要”,捆绑:无) 返回 storyboard.instantiateViewController(withIdentifier: "targetViewControllerID") as!目标视图控制器 }

  2. 在情节提要 ID 字段中添加 targetViewControllerID。

【问题讨论】:

  • 是按照您的图表从 Viewcontroller-1 到 ViewController-3 到 TargetViewController 吗?
  • 从ViewController 1 直接到TargetViewController。按钮点击将发生在ViewController 1。
  • 可以,但是如果你想从TargetViewController(
  • 嘿,@fs_tigre 请检查我的回答可能会对你有所帮助。
  • 如果是这样的话,@Sumitsingh 就是要走的路:)。 1. 选择第三个选项卡。 2.获取第三个标签的导航控制器。 3. 创建 TargetVC。 4. 推送到导航控制器以获取第三个选项卡。编辑:您可能需要在导航控制器上调用 popToRoot 以避免混乱。

标签: ios swift uinavigationcontroller tabbarcontroller


【解决方案1】:

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

    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)

我使用了相同的解决方案。这是我的工作代码。

【讨论】:

  • 对不起,我不完全理解你代码的前两行,这是ViewController 1 或TargetViewController 的单例吗?我不能让它工作。
  • @fs_tigre 它是 TabbarController 的单例类,其中添加了所有四个控制器,所以当我在任何控制器中需要 TabController 时,我可以使用它。让我详细解释一下: 1)TabController.shared.tabcontroller.selectedIndex = 1:此行将在 ViewController3 上重定向到您,在您的情况下,您必须传递您的索引。 2) let navigation = TabController.shared.tabcontroller.selectedViewController?.navigationController :这一行将为您提供所选视图控制器的 NavigationController 对象。之后你只需要推送到 TargertVC
  • 谢谢你的解释,我会试一试,让你知道。我喜欢这个,因为它的代码似乎更少,但我仍然不确定tabcontroller 方法是如何实现的。
【解决方案2】:

您可以直接从 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)

编辑

阅读 cmets 后对您的要求有了清晰的了解

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

先选择特定的索引

   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 方法添加到 TargetViewController

希望对你有帮助

【讨论】:

  • 我无法完成这项工作,没有错误它只是没有做任何事情。谢谢。
  • @fs_tigre 我已尝试编辑我的答案,请确认它是否对您有帮助。如果您卡在任何地方,请告诉我
  • 非常感谢。快速提问,有没有办法完成同样的事情,但没有TargetViewController 中的类方法?换句话说,我希望调用方法中的所有代码。
  • @fs_tigre 是的,可以只写let vc = self.storyboard.instantiateViewController(withIdentifier: "yourIdentifer") as! TargetViewController 而不是let vc = TargetViewController.viewController()
  • @fs_tigre 用于代码重用。现在假设你必须从 5 个不同的地方调用这个 vc,那么你必须在 5 个不同的地方编写相同的代码。另一个例子是您更改故事板标识符,然后您必须更改每个地方。希望对你有帮助
【解决方案3】:

在 ViewController 1 中按钮的动作函数中,你可以使用这个:

     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") 

【讨论】:

  • 这确实把我带到了TargetViewController,问题是它没有显示后退按钮,正如@Denislava Shentova 提到的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 2017-10-22
  • 2016-03-03
  • 1970-01-01
相关资源
最近更新 更多