如何在TabBarContoller的两个视图控制器之间传递数据,其中第一个视图控制器是TableViewController

时间:2016-05-01 12:24:16

标签: ios swift uitableview uitabbarcontroller

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

最初我尝试使用segue这样做。选择单元格时,将调用segue,选择选项卡时则不会。但是使用这种方法,segue正在创建一个MapViewController的新实例,而不是调用实际的实例。所以,我删除了segue并试图通过这里的许多帖子中的建议来传递自定义类。但问题是,由于地图已加载到viewWillAppear中,因此值未正确更新。我想了解如何实现这一目标。当用户在表视图中选择单元格时,应打开实际的MapViewController,并正确更新数据。

谢谢

2 个答案:

答案 0 :(得分:1)

在两个viewcontroller之间传递数据的最佳方法是获取要传递数据的viewcontroller的引用。

假设在 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并更新实例变量value.Now在viewWillAppear方法中,您可以重新加载mapview。

答案 1 :(得分:0)

在这种情况下,您必须使用Delegate-Protocol方法传递数据。

  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方法重新加载地图数据。