2017-05-10 89 views
0

我知道有向後傳遞數據的答案,但它們是連續視圖控制器的答案。我有3個視圖控制器和一個導航控制器。所有的賽段都是「show segue」。我想將數據從VC3傳遞給VC1。我試圖使用委託,但被卡住:iOS/Swift 3:在非連續視圖控制器之間向後傳遞數據

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個塞格斯。 您的善意幫助將不勝感激。

+0

[unwind segue](https://developer.apple.com/library/content/technotes/tn2298/_index.html)是你需要的所有東西 – Paulw11

+0

所以不能用委託來完成?我的VC3有一個表格視圖。每當我點擊一個單元格時,我想移動到VC1並將數據傳遞給它。我不確定我如何放鬆地做到這一點。 – benh

+0

你可以使用委託,但它更混亂。您需要定義協議並通過不需要它的視圖控制器「下線」傳遞委託。通過使用unwind方法,VC1可以訪問故事板segue的'sourceViewController'屬性,通過它的unwind方法來獲取對VC3的引用。然後它可以從vc3的屬性中讀取所需的數據 – Paulw11

回答

0

您可以使用如此Apple Tech Note中所示的展開順序。

。在你的故事板,創造一個放鬆身心SEGUE如技術說明顯示,並給它一個標識符,說「unwindToVC1」

中VC3,創建存儲選擇的值,並在表中的didSelectRowAt使用performSegue屬性函數調用它,最早存儲在屬性所選擇的值:

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創建展開操作方法,並訪問該丙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之間的視圖控制器,並用一個簡單的開卷SEGUE取回它。

+0

謝謝你的回答。它看起來像從VC3移動到VC1之前完成self.selectedValue有一個值,所以它始終爲零。在每個動作之後打印時,我會看到func展開(sender:UIStoryboardSegue)被調用,然後才從tableView函數中看到self.selectedValue的值。 @ Paulw11 – benh

+0

請確保您沒有直接從故事板中的tableview行鏈接unwind segue;它需要是一個程序化的segue,所以你應該從視圖控制器對象拖動到出口圖標。 – Paulw11

+0

我知道我是***中的一員,我感謝您的耐心,但我認爲這就是我所做的:我創建了@IBAction func,然後將表格視圖單元格拖到出口處。然後我選擇了列表中的動作。然後我給了它一個標識符。那是對的嗎? – benh

相關問題