2017-09-06 65 views
0

我想根據在tableView中選擇的行,將數據從一個viewController傳遞到另一個viewController。要做到這一點,我已經實現了以下功能:準備segue返回nil爲indexPathForSelectedRow?

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") 
     } 

    } 

我相信我擁有了一切設置正確,然而,儘管從didSelectRowAt print語句總是爲[0,0](在該indexPath返回值表中只有一節和一行),prepare中的打印語句總是告訴我indexPathnil。如果我刪除條件if let,應用程序將崩潰,因爲fullOrderedMessageArray[(indexPath.row)]包含零值。我不知道爲什麼它一直返回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) 

通過這條線,你問你的tableview要取消選擇行。 該語句之後沒有因此選擇行,當你問表視圖所選擇的行它給返回nil

self.messagesListTableView.indexPathForSelectedRow // will be nil 

雖然,巴普已經提供瞭解決問題的方法,但是這是回答你問題,「準備segue返回nil爲indexPathForSelectedRow?」

只需註釋掉messagesListTableView.deselectRow(at: indexPath, animated: true),您的舊代碼將按預期工作。