我在mapview中有许多注释(与rightCalloutAccessory按钮)。该按钮将执行一个从mapview到tableview的segue。我想传递给tableview一个不同的对象(持有数据),这取决于哪个callout按钮被单击。
例如:(完全是瞎编的)
注释1 (Austin) ->传递数据obj 1(与Austin相关)
注释2(达拉斯)->传递数据obj 2(有关达拉斯)
注释3(休斯顿)->传递数据obj 3等等…(你会得到
主意)
我能够检测到哪个调出按钮被单击。
我使用prepareForSegue:来传递数据对象到目标ViewController。由于我不能使这个调用为我需要的数据对象额外的参数,有什么优雅的方法来实现相同的效果(动态数据对象)?
任何建议都将不胜感激。
我使用这个解决方案,这样我就可以在同一个函数中保持对segue的调用和数据通信:
private var segueCompletion : ((UIStoryboardSegue, Any?) -> Void)?
func performSegue(withIdentifier identifier: String, sender: Any?, completion: @escaping (UIStoryboardSegue, Any?) -> Void) {
self.segueCompletion = completion;
self.performSegue(withIdentifier: identifier, sender: sender);
self.segueCompletion = nil
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
self.segueCompletion?(segue, sender)
}
用例应该是这样的:
func showData(id : Int){
someService.loadSomeData(id: id) {
data in
self.performSegue(withIdentifier: "showData", sender: self) {
storyboard, sender in
let dataView = storyboard.destination as! DataView
dataView.data = data
}
}
}
这似乎对我有用,但是,我不能100%确定perform和prepare函数总是在同一个线程上执行。
我在UIViewController上实现了一个类库,简化了这个操作。
基本上,你在NSDictionary中设置你想要传递的参数与执行segue的uiitem关联。它也适用于手动segue。
例如,你可以这样做
[self performSegueWithIdentifier:@"yourIdentifier" parameters:@{@"customParam1":customValue1, @"customValue2":customValue2}];
对于手动segue或者创建一个带有segue的按钮并使用
[button setSegueParameters:@{@"customParam1":customValue1, @"customValue2":customValue2}];
如果目标视图控制器不符合键的键值编码,什么都不会发生。它也适用于键值(对unwind segue很有用)。
点击这里查看
https://github.com/stefanomondino/SMQuickSegue