我想根据我tableView
中选择的行,将数组中的信息从一个viewController传递到另一个viewController。为此,我实现了以下功能:
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
的打印声明始终返回[0,0]的indexPath
的值(在表中只有一个部分)和{一行),prepare
中的打印语句总是告诉我indexPath
是nil
。如果我删除了if let
条件,则应用会崩溃,因为fullOrderedMessageArray[(indexPath.row)]
包含nil值。我不知道为什么它为一个函数返回nil而不为另一个函数返回nil。
答案 0 :(得分: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 :(得分:1)
这里的罪魁祸首是
messagesListTableView.deselectRow(at: indexPath, animated: true)
通过此行,您已要求您的tableview取消选择所选行。 在此语句之后没有选择行,因此,当您要求表视图返回所选行时,它将给出nil
self.messagesListTableView.indexPathForSelectedRow // will be nil
尽管如此,Bapu已经为您的问题提供了解决方案,但这是您的问题的答案,“为indexPathForSelectedRow准备segue返回nil?”
只需注释掉messagesListTableView.deselectRow(at: indexPath, animated: true)
,您的旧代码就会按预期运行。