2017-08-09 350 views
3

我試圖將用戶單擊的單元格的值傳遞給另一個視圖控制器。從表格視圖控制器傳遞值到視圖控制器

這是我的代碼。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    productDisplayed = currentProductList[indexPath.row] as? Product 
    performSegue(withIdentifier: "ProductDetailSegue", sender: self) 
} 


override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if (segue.identifier == "AddProductSegue"){ 
     let controller: AddProductViewController = segue.destination as! AddProductViewController 
     controller.delegate = self 
    } 

    if (segue.identifier == "ProductDetailSegue"){ 

     let controller: ProductDetailsViewController = segue.destination as! ProductDetailsViewController 
     controller.currentProduct = productDisplayed 
    } 
} 

首先,我沒有寫「performSegue()」。 我遇到的問題是屏幕將首先被傳輸,而不是將值賦給「productDisplayed」,這意味着第二個VC中的對象「currentProduct」爲零。

然後我加了「performSegue()」。 它仍然沒有工作。事情是第二個屏幕顯示兩次。第一次與上面的圖片一樣。第二次是正確的。

但是,當我試圖點擊左上方的後退按鈕。它返回到零頁面而不是ProductDetail頁面。截圖如下。

enter image description here

enter image description here

這似乎是 「準備」 方法總是被稱爲第一次那麼的tableView。如何更改訂單?如果可以,我認爲這應該是固定的。

希望能得到您的幫助。 謝謝。

回答

1

原因問題:
在你的故事板,你可能已經束縛,ProductDetailsViewControllerUITableViewCell直接。

這意味着,點擊/選擇行後,它將直接執行segue(導航)操作。

與此同時,編程執行使用performSegue(withIdentifier: "ProductDetailSegue", sender: self)

解決方案導航操作:
有兩種方法來解決這個問題。

  1. 我建議 - 在你的故事板,交換機從UITableViewCellUIViewController(取下UITableViewCell賽格瑞連接,並連接你的tableview的UIViewController相同SEGUE連接)
  2. 在你的源代碼,刪除賽格瑞連接/刪除此行performSegue(withIdentifier: "ProductDetailSegue", sender: self)並處理來自此功能的數據傳輸override func prepare(for segue: UIStoryboardSegue, sender: Any?)
+0

我試圖刪除「performSegue()」。但轉移的對象當時沒有。這似乎是價值沒有分配給productDisplayed。 –

+0

哇!你的第一種方式有效!非常感謝你。但我仍然對如何以第二種方式製作它感到困惑。 –

+0

很酷。答案被接受。你能解釋爲什麼第二種方式不起作用嗎? –

相關問題