为indexPathForSelectedRow准备segue返回nil?

时间:2017-09-06 05:38:39

标签: swift tableview

我想根据我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中的打印语句总是告诉我indexPathnil。如果我删除了if let条件,则应用会崩溃,因为fullOrderedMessageArray[(indexPath.row)]包含nil值。我不知道为什么它为一个函数返回nil而不为另一个函数返回nil。

2 个答案:

答案 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),您的旧代码就会按预期运行。