2017-05-10 8 views
0

データを後ろ向きに渡す回答がありますが、連続したView Controller用です。私は3つのビューコントローラとナビゲーションコントローラを持っています。すべてのセグは「ショー・セグ」です。私はVC3からVC1にデータを渡したいと思います。私は、デリゲートを使用しようとしているが、立ち往生:iOS/Swift 3:連続していないView Controller間でデータをやりとりする

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 seguesを持っているということです。 あなたの親切な助けに感謝します。

+0

[unwind segue](https://developer.apple.com/library/content/technotes/tn2298/_index.html)がすべて必要です – Paulw11

+0

デリゲートを使って行うことはできませんか?私のVC3にはテーブルビューがあります。セルをクリックするたびに、VC1に移動してデータを渡したいと思います。私はどのように私はそれをやわらげることができるか分からない。 – benh

+0

デリゲートを使用することはできますが、処理が面倒です。プロトコルを定義し、それを必要としないビューコントローラーを介してデリゲートを「ダウンライン」に渡す必要があります。 unwindメソッドを使用することにより、VC1は、unwindメソッドを渡したストーリーボードsegueの 'sourceViewController'プロパティにアクセスして、VC3への参照を取得できます。その後、vc3のプロパティから必要なデータを読み取ることができます – Paulw11

答えて

0

このApple Tech Noteのように巻き戻しセグを使用できます。ストーリーボードで

、テクニカルノートに示すようにアンワインドセグエを作成し、それに識別子を与え、「unwindToVC1」VC3で

を言って、選択した値を保存して、テーブルのdidSelectRowAtperformSegueを使用するプロパティを作成しますVC1でリラックスアクションメソッドを作成し、プロペラにアクセス

class VC3: UIViewController { 

    var selectedValue: YourValueType? 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     self.selectedValue = myData[indexPath.row] 
     self.performSegue(withIdentifier: "unwindToVC1", sender: self) 
    } 
} 

:それを呼び出す関数は、最初のプロパティで選択された値を格納しましたerty

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間のビューコントローラの任意の番号を持つことができ、簡単なアンワインドセグエとそれに戻って取得します。

+0

親切にお答えいただきありがとうございます。 VC3からVC1への移動は、self.selectedValueが値を持つ前に行われるように見えるので、常にnilです。各アクションの後に印刷すると、func unwind(送信側:UIStoryboardSegue)が呼び出され、その後、tableView関数からself.selectedValueの値が表示されることがわかります。 @ Paulw11 – benh

+0

ストーリーボードのテーブルビュー行からunwind segueを直接リンクしていないことを確認してください。プログラムのセグメンテーションが必要なので、ビューコントローラオブジェクトから終了アイコンまでドラッグする必要があります。 – Paulw11

+0

私は***に苦しんでいることを知っています。私はあなたの辛抱強さに感謝します。しかし、私はそう思いました。@ IBAction funcを作成してから、テーブルビューのセルをexitにドラッグしました。私はリストからその行動を選んだ。それから私はそれに識別子を付けました。あれは正しいですか? – benh

関連する問題