【问题标题】:How to change the ViewController within a TabBarController by selecting a UITableViewCell?如何通过选择 UITableViewCell 来更改 TabBarController 中的 ViewController?
【发布时间】:2019-06-21 19:47:22
【问题描述】:

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

我有一个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”的不同视图控制器中工作,用户可以在其中输入他们的位置和状态。

【问题讨论】:

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

标签: ios swift uitableview uitabbarcontroller didselectrowatindexpath


【解决方案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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-02
    • 2014-04-15
    • 2012-05-16
    • 2010-12-23
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 2017-07-16
    相关资源
    最近更新 更多