我知道有向后传递数据的答案,但它们适用于连续的视图控制器。我有3个视图控制器和一个导航控制器。所有segues都是“show segue”。我想将数据从VC3传递到VC1。我正在尝试使用委托,但卡住了:
protocol Delegate:class {
func getCityId(with id: String)
}
Class VC3:UIViewController{
weak var delegate: Delegate?
let id:String?
func passDataBackwards() {
delegate?.getCityId(with: self.id!)
}
}
Class VC1:UIViewController, Delegate{
func getCityId(with id: String) {
print ("id from search: \(id)")
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let vc3 = (segue.destination as! VC3)
vc3.delegate = self
}
}
我的问题是我的源和目的地之间有2个segue。 非常感谢您的帮助。
答案 0 :(得分:0)
您可以使用展开segue,如Apple Tech Note所示。
在你的故事板中,创建一个Unwind segue,如技术说明中所示,并给它一个标识符,说" unwindToVC1"
在VC3中,创建一个属性来存储所选值,并在表performSegue
函数中使用didSelectRowAt
来调用它,首先将所选值存储在属性中:
class VC3: UIViewController {
var selectedValue: YourValueType?
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.selectedValue = myData[indexPath.row]
self.performSegue(withIdentifier: "unwindToVC1", sender: self)
}
}
在VC1
中创建展开操作方法并访问该属性
class VC1: UIViewController {
@IBAction func unwind(sender: UIStoryboardSegue) {
if let sourceVC = sender.sourceViewController as? VC3 {
if let selectedValue = sourceVC.selectedValue {
// Do something with the selected value
}
}
}
}
现在,您可以在当前VC和VC1之间拥有任意数量的视图控制器,并通过简单的展开segue返回它。