2017-08-09 13 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"に値を割り当てるのではなく、最初に画面が転送されるということです。つまり、2番目のVCのオブジェクト "currentProduct"はゼロです。

次に、performSegue()を追加しました。 それでも動作しませんでした。物事は2度目に表示された第2画面です。最初の時間は上記の写真と同じです。そして2回目は正しいです。

しかし、私は左上の戻るボタンをクリックしようとしました。 ProductDetailページではなくnilページに戻りました。スクリーンショットは次のとおりです。

enter image description here

enter image description here

いつものtableViewその後、最初に呼ばれて "準備" の方法のように思えます。注文を変更するには?できれば、これは修正すべきだと私は思う。

あなたの助けを願います。 ありがとうございます。問題の

答えて

1

原因:ストーリーボードで
、あなたは直接UITableViewCellで、ProductDetailsViewControllerを結合したことがあります。

これは、行のクリック/選択時に、セグ(ナビゲーション)操作を直接実行することを意味します。

同時に、プログラム的にあなたはperformSegue(withIdentifier: "ProductDetailSegue", sender: self)

ソリューション使用したナビゲーション操作を実行:あなたはこの問題を解決するには、2つの方法があり
を。

  1. 私はお勧めします - あなたのストーリーボードでは、UIViewControllerからUITableViewCellからスイッチセグエ接続を削除/削除、あなたのソースコードでは
  2. UITableViewCellからセグエ接続を削除し、あなたのテーブルビューのUIViewControllerと同じセグエ接続を添付)この行performSegue(withIdentifier: "ProductDetailSegue", sender: self)とこの関数からのデータ送信を処理するoverride func prepare(for segue: UIStoryboardSegue, sender: Any?)
+0

"performSegue()"を削除しようとしました。しかし、転送されたオブジェクトは無かった。値がproductDisplayedに割り当てられていないようです。 –

+0

うわー!あなたの最初の方法で動作します!どうもありがとうございました。しかし、私はまだあなたの第二の方法でそれを作る方法について混乱しています。 –

+0

Cool。答えは受け入れられます。第2の方法ではうまくいかない理由を説明してください。 –

関連する問題