2017-03-11 10 views
0

私はDetailTableViewControllerという名前のtableviewcontrollerを持っており、DetailTableViewControllerという名前の次のtableviewcontrollerにデータを渡す必要があります。しかし、ユーザーがDetailTableViewControllerのセルをクリックすると、データを渡す必要があります。次に、「オプション値をアンラップしている間に予期せぬ結果が出ています」というエラーが表示されます。Swift 3で並べ替えてください。tableviewcontrollerからdetailviewcontrollerにデータを送信

+0

エラーラインの直前に渡された渡された変数を一度印刷してみてください。 –

+0

そのnil @ Tushar Sharma – Tamannah

答えて

1

まずあなたが最初のビューから送信する値を保持するためにあなたの詳細ビューコントローラで変数を作成しますコントローラ。最初のビューコントローラーでdidSelectRowAtメソッド内の値を割り当ててから、プログラムでナビゲートします。この方法では、データを送信するためにprepare for segueメソッドを実装する必要はありません。

didselectrowatメソッドを実装するだけで済みます。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     let selected = firstArray[indexPath.row] 
     let detailvc = self.storyboard?.instantiateViewController(withIdentifier: "DetailTableViewController") as! DetailTableViewController 

     detailvc.type = selected 
     self.present(detailvc, animated: true, completion: nil) 

    } 

初めてビデオチュートリアルを作成しました。 how to pass data from one table view controller to another。これがあなたに役立つことを願っています。

+0

@Tamannahの動画はまだアップロードされています。中にお試しください....ありがとうございます。 –

+0

先ほど紹介したコードを参考にして解決策を教えてください。すべてのセルを押しながら、医療用アレイからのデータのみを表示します。 @ Anuradh S – Tamannah

+0

私はあなたのために作成した数分後にビデオチュートリアルを試みます(まだアップロードしています)。 View Controller間でデータを渡す方法と、条件でデータを表示する方法について説明します。それを試してみよう..... –

0

performSegueを呼び出すとvar valueToPassに値がないようです。次のコードでvalueToPassの値を代入するようにしてください:

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

    valueToPass = guides[indexPath.row] 
    performSegue(withIdentifier: "Cell", sender: self) 
} 

そして、あなたのセグエを作成し、あなたのViewControllerを形成し、多分あなたは、細胞からのセグエを作成します。

enter image description here

+0

いいえ、まだ同じエラーがあります。 @DiegoQ – Tamannah

+0

prepareForSegue関数にブレークポイントを追加し、var valueToPassに値があることを確認します。クラッシュは何かvarがゼロであるためです。 – DiegoQ

+0

はい、そのnil @ DiegoQ – Tamannah

0

didSelectRow新しいindexPathを設定している内部。それを削除すると、そのトリックを行う必要があります。すべての

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

    // Don't reassign indexPath 
    // let indexPath = tableView.indexPathForSelectedRow! 
    let currentCell = tableView.cellForRow(at: indexPath)! as UITableViewCell 

    valueToPass = currentCell.textLabel?.text 
    performSegue(withIdentifier: "Cell", sender: self) 
} 
+0

いいえ、ありがとうございます。まだ同じエラーがあります。 @ Ray Tso – Tamannah

+0

いつnilが見つかりましたか?コードのどの部分? –

+0

私は上記のエラーをエラーとして指定しました。見てください。 – Tamannah

2
  • まず、、このような場合にはビュー(セル)からデータを取得していないモデル(データソース配列)から、常にそれを得るん。すべての

  • 第二には、prepare(for segueの署名は、あなたもvalueToPassを削除することができ、むしろselfよりindexPathを渡すdidSelectRowAtでスウィフト3.

のために間違っています。 prepareForSegue

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    performSegue(withIdentifier: "Cell", sender: indexPath) 
} 

モデルからデータを取得し、詳細ビューコントローラに渡す:

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

    if segue.identifier == "Cell" { 
     let viewController = segue.destination as! GuidesDetailsTableViewController 
     let indexPath = sender as! IndexPath 
     viewController.passedValue = guides[indexPath.row] 
    } 
} 
+0

私は今編集しましたが、すべてのセルを押している間に医療用アレイからのデータだけを表示します。なぜそれはpassedValueを読んでいないのですか? @ vadian – Tamannah

+0

あなたのソリューションから今編集しました...どうすれば今解決できますか? – Tamannah

+0

'viewWillAppear'でtableViewをリロードする必要があります – vadian

関連する問題