iOS / Swift 3:在非连续视图控制器之间向后传递数据

时间:2017-05-10 22:03:29

标签: ios swift segue

我知道有向后传递数据的答案,但它们适用于连续的视图控制器。我有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。 非常感谢您的帮助。

1 个答案:

答案 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返回它。