准备segue返回nil为indexPathForSelectedRow?

问题描述:

我想根据在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这样做给我的错误,即“方法不会覆盖任何方法从它的超类” –

你可以试试这个。

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

} 

罪魁祸首这里是

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

通过这条线,你问你的tableview要取消选择行。 该语句之后没有因此选择行,当你问表视图所选择的行它给返回nil

self.messagesListTableView.indexPathForSelectedRow // will be nil 

虽然,巴普已经提供了解决问题的方法,但是这是回答你问题,“准备segue返回nil为indexPathForSelectedRow?”

只需注释掉messagesListTableView.deselectRow(at: indexPath, animated: true),您的旧代码将按预期工作。