2017-09-06 6 views
0

tableViewで選択された行に基づいて、あるviewControllerから別のviewControllerに配列の情報を渡したいとします。これを行うために、私は次のような機能を実装している:indexPathForSelectedRowのためにsegueがnilを返すように準備しますか?

func tableView(_ messagesListTableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     messagesListTableView.deselectRow(at: indexPath, animated: true) 
     performSegue(withIdentifier: "individualMessageSegue", sender: self) 
     print(indexPath)//returns [0,0]... meaning the first row 
    } 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     guard segue.identifier == "individualMessageSegue" else{return} 

     if let indexPath = self.messagesListTableView.indexPathForSelectedRow{ 
      let openedMessageConversation = fullOrderedMessageArray[(indexPath.row)] //cause app to crash because nil value 
      let destViewController: IndividualMessageVC = segue.destination as! IndividualMessageVC 
      destViewController.messageConvo = openedMessageConversation 
     }else{ 
      print("it was nil") 
     } 

    } 

私はすべてが正しく設定されていると信じて、しかし、いつものindexPath [0,0](中の値を返すdidSelectRowAtからprint文にもかかわらず、テーブルは1つのセクションと1つの行だけです)、prepareのprintステートメントは、常にindexPathnilであることを通知します。 if letを削除すると、fullOrderedMessageArray[(indexPath.row)]にはnil値が含まれているため、アプリがクラッシュします。私はなぜそれが他のものではない一方の関数のためにnilを返され続けるのか分かりません。

+0

@ SergeyGamayunovを実行すると、「メソッドはスーパークラスのメソッドをオーバーライドしない」というエラーが表示されます –

答えて

2

これを試すことができますか?

func tableView(_ messagesListTableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    messagesListTableView.deselectRow(at: indexPath, animated: true) 
    performSegue(withIdentifier: "individualMessageSegue", sender: indexPath) 
    print(indexPath)//returns [0,0]... meaning the first row 
} 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    guard segue.identifier == "individualMessageSegue" else{return} 

    if let indexPath = sender as? IndexPath { 
     let openedMessageConversation = fullOrderedMessageArray[(indexPath.row)] 
     let destViewController: IndividualMessageVC = segue.destination as! IndividualMessageVC 
     destViewController.messageConvo = openedMessageConversation 
    }else{ 
     print("it was nil") 
    } 

} 
1

ここ犯人はあなたが選択した行の選択を解除し、あなたのテーブルビューを求めている。この線で

messagesListTableView.deselectRow(at: indexPath, animated: true) 

です。 この文の後ので、選択されていない行、あなたが

self.messagesListTableView.indexPathForSelectedRow // will be nil 

nilを、それが与える選択された行を返すために、テーブルビューを頼むときものの、バプはあなたの問題への解決策を提供してきたが、これはあなたへの答えではありません"indexPathForSelectedRowに対してnilを返すセグの準備をする?"

messagesListTableView.deselectRow(at: indexPath, animated: true)をコメントアウトすると、古いコードが期待通りに機能します。

関連する問題