2017-05-03 17 views
0

私は、同じキーを持つ辞書があります。tableViewから辞書から選択した値を取得するには?

var food = [["item" : "Burger", "image": "burger"], 
      ["item" : "Pizza", "image": "pizza"], 
      ["item" : "Lunch", "image": "lunch"], 
      ["item" : "Coffee", "image": "coffee"]], 

をそして、それは私のテーブルビューで使用されています。各セルは名前をディスパッチします。私が欲しいそして、何

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! Cell 

    let foodObjects = food[indexPath.row] 

    cell.background.image = UIImage(named: foodObjects["image"]!) 
    cell.nameLabel.text = foodObjects["item"] 

    return cell 
} 

は、第二ビューコントローラに渡され、選択されたセルから項目値です。 私はこの機能を通してこのことができることを知っていますが、選択した項目から値を得ることはできません。誰かが私を助けることができますか?あなたはoverride func prepare(for segue: UIStoryboardSegue, sender: Any?)機能から選択indexpathを検索したい場合は

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    let indexPath = self.tableView.indexPathForSelectedRow?.row 

    let resVC = segue.destination as! RestaurantVC //second View controller 

    let selectedItem = food[indexPath.["item"]] // How to do this?? 
} 
+0

performSegueWithIdentifierをいつ呼び出すのですか? – KKRocks

+0

あなたは正しいindexpathを得ましたか? – KKRocks

+0

セルをクリックしたときに呼び出されます – belab

答えて

1

次のコードを試してみてください。この

var food: [Dictionary<String, String>] = [["item" : "Burger", "image": "burger"], 
      ["item" : "Pizza", "image": "pizza"], 
      ["item" : "Lunch", "image": "lunch"], 
      ["item" : "Coffee", "image": "coffee"]] 

、あなたが設定することができますをしてみてくださいコントローラresVC 210コード

resVC.selectedItem = food[indexPath]["item"]! 

又は

let selectedItem = food[indexPath]["item"] 
if let selectedItem = selectedItem { 
    resVC.selectedItem = selectedItem 
} 
+0

のようなものが動作します: 'let selectedItem = food [indexPath!] [" item "]' そして、それを印刷すると正しい選択項目になります。 しかし、私は新しいViewControllerを、そのクラッシュにラベルを付けるためにそれを割り当ててみてください。 'resVC.selectedItem.text = selectedItem' **エラー:致命的なエラー:オプションの値をアンラップしながら、予想外にはnil ** – belab

+0

してみてください@belab選択されたItemをSegueメソッドの準備として印刷する。 –

+0

私はそれを行いました。それはオプションでもなくてもかまいません。 Correc値(例:_Pizza_ – belab

1

使用この方法は、テーブルビュー

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

//print(food[indexPath.row].first?.value) 
      } 
+2

または 'food [indexPath] [" item "]' – shallowThought

1

から特定のオブジェクトを選択します。 tableView.indexPath(for cell: UITableViewCell)を使用できます。この

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    let indexPath = self.tableView.indexPathForSelectedRow?.row 

    let resVC = segue.destination as! RestaurantVC //second View controller 

    resVC.selectedItem = food[tableview.indexPathForSelectedRow.row]["item"] // How to do this?? 
} 
1

を試してみてください、この

var selectedItem:String! 

ようRestaurantVCでプロパティを作成

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
{ 

     let destinationViewController = segue.destination as! RestaurantVC 

     if let selectedCell = sender as? UITableViewCell 
     { 
      let indexPath = tableView.indexPath(for: selectedCell) 
      let foodObjects = food[indexPath.row] 

     } 

} 
1

my answer hereをチェックアウトする可能性について、以下により。デリゲートを使用して選択したセル(のセルに渡したデータ)をcell.nameLabel.text = foodObjects["item"]のように取得し、デリゲートイベントでsegueを実行して新しいコントローラに移動し、受け取ったデータをイベントとしてイベントに渡します。だから、のようになります:

func foodItemCellSelected(using foodItem: [String]) // Delegate event of custom cell 
{ 
    self.selectedFoodItem = foodItem; // Retrieve selected item and save it in VC 
    self.performSegue(.....); // Perform segue 
} 


override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    let indexPath = self.tableView.indexPathForSelectedRow?.row 

    let resVC = segue.destination as! RestaurantVC //second View controller 

    resVC.foodItem = self.selectedFoodItem 
} 
2

あなたのコントローラ上の

のvarのSelectedItemのようなプロパティを作成します。

オンにしました選択した項目にその項目を保存します。

ご使用にあたってセグーメソッドを使用してください。

関連する問題