如何通过选择 UITableViewCell 更改 TabBarController 中的 ViewController?

How to change the ViewController within a TabBarController by selecting a UITableViewCell?

我正在尝试通过选择一个单元格来转换到另一个 UIViewController(它是 UITabBarController 的一部分)。

我有一个 HistoryViewController,其中包含此单元格和表格视图。一旦用户通过 LoginViewController 登录,这个历史视图控制器就是 "present modally current context"。不确定这对问题是否重要,但我认为值得一提。

这是层次结构:

-LoginViewController -> HistoryViewController(这是下面列出的代码所在的位置)

-ViewController(用户单击特定单元格后我尝试去的地方。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    LocationInformation.city = locations[indexPath.row].city
    LocationInformation.state = locations[indexPath.row].state

    self.tabBarController?.selectedIndex = 1
}

目标是将位置的城市和州设置为全局变量 "LocationInformation"(有效),然后更改为无效的 ViewController

代码 self.tabBarController?.selectedIndex = 1 在不同的 viewController 中工作,我调用了 "searchViewController",用户在其中输入他们的位置和状态。

我认为问题出在这里:

This History View Controller is "present modally current context" once a user logs in with through the LoginViewController.

当您以模态方式呈现控制器时,新堆栈没有 tabBarController。您可以通过调试 self.tabBarController 的值来检查这一点,我认为它将是 nil

解决方案

如果 TabBarController 是根视图控制器,使用这个:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    LocationInformation.city = locations[indexPath.row].city
    LocationInformation.state = locations[indexPath.row].state

    let rootViewController = UIApplication.shared.keyWindow!.rootViewController
    (rootViewController as? UITabBarController)?.selectedIndex = 1
}