我对SWIFT中的iOS应用程序编程很陌生。作为课程的一部分,我们正在构建一个以TabBarController为根的应用程序。 TabBarController的第一个视图控制器是TableView控制器,第二个视图控制器是MapViewController。我想要实现的是在TableView中选择一行,它将在MapView中绘制相关值。此外,还应通过选项卡栏访问地图(如果选择了地图选项卡,则将显示先前绘制的值)。
最初我尝试使用segue这样做。选择单元格时,将调用segue,选择选项卡时则不会。但是使用这种方法,segue正在创建一个MapViewController的新实例,而不是调用实际的实例。所以,我删除了segue并试图通过这里的许多帖子中的建议来传递自定义类。但问题是,由于地图已加载到viewWillAppear中,因此值未正确更新。我想了解如何实现这一目标。当用户在表视图中选择单元格时,应打开实际的MapViewController,并正确更新数据。
谢谢
答案 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方法传递数据。
在tableviewcontroller中声明一个协议
protocol refreshMapProtocol
{
func refresh(data: Dictionary<String, AnyObject>)
}
在tableviewcontroller上声明一个委托属性
var delegate: refreshMapProtocol?
在mapViewController中符合此协议
在tableviewcontroller的didSelectRowAtIndexPath上,调用委托方法
delegate?.refresh()
tabBarController!.selectedIndex = 1
最后在mapViewController中声明此refresh
方法重新加载地图数据。