准备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
中的打印语句总是告诉我indexPath
是nil
。如果我删除条件if let
,应用程序将崩溃,因为fullOrderedMessageArray[(indexPath.row)]
包含零值。我不知道为什么它一直返回nil而不是另一个。
答
你可以试试这个。
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)
,您的旧代码将按预期工作。
@SergeyGamayunov这样做给我的错误,即“方法不会覆盖任何方法从它的超类” –