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

Ios 如何通过选择UITableViewCell在TabBarController中更改ViewController?,ios,swift,uitableview,uitabbarcontroller,didselectrowatindexpath,Ios,Swift,Uitableview,Uitabbarcontroller,Didselectrowatindexpath,我试图通过在单元格上选择来转换到不同的UIViewController(它是uitabarcontroller的一部分) 我有一个HistoryViewController,其中包含此单元格和表视图。当用户通过LoginViewController登录时,此历史视图控制器即为“当前模式上下文”。不确定这是否与问题有关,但我认为值得一提 以下是层次结构: -LoginViewController ->HistoryViewController(这是下面列出的代码所在) -ViewControlle

我试图通过在单元格上选择来转换到不同的
UIViewController
(它是
uitabarcontroller
的一部分)

我有一个
HistoryViewController
,其中包含此单元格和表视图。当用户通过
LoginViewController
登录时,此历史视图控制器即为“当前模式上下文”。不确定这是否与问题有关,但我认为值得一提

以下是层次结构:

-
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
在另一个名为“searchViewController”的viewController中工作,用户在其中输入其位置和状态。

我认为问题在于:

一旦用户通过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
}

我认为问题在于:

一旦用户通过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
}

选项卡栏控制器出现在层次结构中的何处?如果“登录VC”以模式显示在“登录VC”中,则它将不具有tabBarController属性。看起来“登录VC”是根控制器,它将具有tabBarController指针。您可以使“登录VC”成为“历史VC”的委托或者回顾一下你的观点hierarchy@Callam“ViewController”和“LoginViewController”(这导致“HistoryViewController”都在TabBarController下。就像lobstah说的,“Login VC”是根控制器。@lobstah是的LoginViewController是根控制器,制作“Login VC”的最佳方法是什么“History VC”的代表?或者在用户可以访问“History ViewController”之前,是否有更好的方式来显示登录?我更喜欢创建一个移动VC(让我们称之为根)它将负责显示登录或历史记录,具体取决于应用程序的实际状态。它可以在用户登录之前显示modally Login,然后关闭登录并显示历史记录。但您仍然需要将登录和历史记录中的数据传递给此根VC,以便它知道要做什么。您可以选择任何想要实现的方法(委派、完成处理程序、通知、反应式编程等)。您的选项卡栏控制器在层次结构中的位置?如果您的“历史VC”以模式显示在“登录VC”中,则它将没有选项卡栏控制器属性。看起来像您的“登录VC”是根控制器,它将具有tabBarController指针。您可以将“Login VC”作为“History VC”的委托,也可以查看您的视图hierarchy@Callam“ViewController”和“LoginViewController”(导致“HistoryViewController”)都位于TabBarController下。就像lobstah所说的“登录VC”是根控制器。@lobstah是的LoginViewController是根视图控制器,让“Login VC”成为“History VC”的代表的最佳方式是什么?或者在用户访问“HistoryViewController”之前,有没有更好的方式来显示登录?我更喜欢创建一个移动VC(让我们称之为根)它将负责显示登录或历史记录,具体取决于应用程序的实际状态。它可以在用户登录之前显示modally Login,然后关闭登录并显示历史记录。但您仍然需要将登录和历史记录中的数据传递给此根VC,以便它知道要做什么。您可以选择任何想要实现的方法(委托、完成处理程序、通知、反应式编程等)。