2017-11-16 19 views
0

こんにちは私は1つのテーブルビューコントローラから別のものにオブジェクトを渡そうとしています。 私はセグエとdidselectRowAt機能の準備を使用しています:nivのuiviews間でデータを転送

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    self.myDish = sections[indexPath.section].listofDishes?[indexPath.row] 
    self.sectionName = sections[indexPath.section].sectionName! 

    self.flag = 1 
    performSegue(withIdentifier: "chooseDish", sender: self) 
} 



override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if self.flag != 0{ 
    let selectedDishTableViewController = segue.destination as! SelectedDishViewController 
     selectedDishTableViewController.sectionName = self.sectionName 
     selectedDishTableViewController.dish = self.myDish 

     self.flag = 0 
    } 
} 

prepareforセグエを準備する前に、私はmyDishとセクション名を設定してください作ってるんだdidselectrowat

・タントの道の前に呼び出されるので、私は旗を作成segueのために。

私の2番目のビューコントローラでは、まだ両方の値をnilとして取得します。

これはprepareForSegueが、それはセグエがすでに起こっていることを意味し、... didSelectRow前に呼ばれるので、あなたはそれを強制二度目なっている場合は、私は私の第二のコントローラ

var dish:Dish? 
var sectionName:String? 
+0

インターフェイスビルダのセルアクションに直接セグを繋ぎ、perfromSegueを使用しようとしているようです。アクションセグを削除します。選択したインデックスパスをあなたのセグに '送信者 'として与えて、' prepare'でアクセスできるようにすることもできます。 – Paulw11

答えて

1

にVARSを宣言する方法ですdidSelectRowでperformSegueを明示的に呼び出すことによって呼び出されます。< - ビューコントローラがすでにそれらの変数に対してヌル値でセグメンテーションされているため、無視されます。

ソリューションは、ここではこのような何かを行うには、次のようになります。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let indexPath = tableView.indexPathForSelectedRow { 
     let selectedDishTableViewController = segue.destination as! SelectedDishViewController 
     selectedDishTableViewController.dish = sections[indexPath.section].listofDishes?[indexPath.row] 
     selectedDishTableViewController.sectionName = sections[indexPath.section].sectionName! 
    } 
} 

あなたがのtableViewで他に何もする必要はありません。これで、このためdidSelect ... ..それが動作するかどうかレムが知っていますでる。

+0

それはうまくいきました!有難うございます。 –

関連する問題