【问题标题】:How to pass data between two view controllers of a TabBarContoller where the first view controller is a TableViewController如何在 TabBarContoller 的两个视图控制器之间传递数据,其中第一个视图控制器是 TableViewController
【发布时间】:2016-08-26 06:47:43
【问题描述】:

我对 SWIFT 中的 iOS 应用程序编程非常陌生。作为我们课程的一部分,我们正在构建一个以 TabBarController 作为根的应用程序。 TabBarController 的第一个视图控制器是 TableView 控制器,第二个视图控制器是 MapViewController。我想要实现的是在 TableView 中选择一行,它将在 MapView 中绘制相关值。此外,地图也应该可以通过标签栏访问(如果选择了地图标签,则将显示先前绘制的值)。

最初我尝试使用 segue 来完成此操作。 When a cell is selected the segue is called and when the tab is selected it doesn't.但是使用这种方法,segue 正在创建 MapViewController 的新实例,而不是调用实际的实例。因此,我删除了 segue 并尝试按照此处许多帖子中的建议通过自定义类。但问题是由于地图是在 viewWillAppear 中加载的,因此这些值没有得到正确更新。我想就如何实现这一目标提出建议。当用户选择表格视图中的单元格时,应打开实际的 MapViewController 并正确更新数据。

谢谢

【问题讨论】:

标签: ios swift uitableview uitabbarcontroller


【解决方案1】:

在两个视图控制器之间传递数据的最佳方式是获取要传递数据的视图控制器的引用。

假设在 ViewController1 中用户选择了一些 tableview 单元格,然后在方法中

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        if let secondVC = self.tabBarController?.viewControllers?[1] as? ViewController2 {
        self.tabBarController?.selectedIndex = 1
        secondVC.instanceVariable = "updated value"
    }
}

这将带到 viewController2 并更新实例变量值。现在在viewWillAppear 方法中您可以重新加载地图视图。

【讨论】:

  • 您好,谢谢您的建议,它成功了!其实我之前也做过类似的事情,所以当我尝试你的方法时,我得到了相同的结果。我意识到我的对象正在更新,没有任何问题。相反,问题在于地图注释。由于地图是在 viewWillAppear 方法中调用的,因此注释不会自动更新。第一次单击注释会显示旧值,第二次单击会显示新值 - 实际上它们是这样交替的。
  • 嘿,我明白了。实际上,这些值被附加而不是更新。所以更正了,使用 viewdidAppear 方法删除注释超时视图消失了。终于得到了我需要的东西。感谢您的帮助。
【解决方案2】:

在这种情况下,您将不得不使用委托协议方法来传递数据。

  1. 在你的 tableviewcontroller 中声明一个协议

    protocol refreshMapProtocol { func refresh(data: Dictionary<String, AnyObject>) }

  2. 在你的 tableviewcontroller 上声明一个委托属性

    var delegate: refreshMapProtocol?

  3. 在你的 mapViewController 中遵守这个协议

  4. 在您的 tableviewcontroller 的 didSelectRowAtIndexPath 上,调用委托方法

    delegate?.refresh() tabBarController!.selectedIndex = 1

  5. 最后在你的mapViewController中声明这个refresh方法来重新加载地图数据。

【讨论】:

    猜你喜欢
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多