swift如何修复为表视图准备segue

时间:2016-10-07 21:39:54

标签: swift tableview

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "toChat2" {

        guard let navController = segue.destinationViewController as? UINavigationController,
        let chatController = navController.viewControllers.first as? ChatViewController else { return }

        let indexPaths = self.tableView!.indexPathsForSelectedRows! //crashes on this line
        let indexPath = indexPaths[0] as NSIndexPath

        chatController.senderId = FIRAuth.auth()?.currentUser?.uid
        chatController.senderDisplayName = FIRAuth.auth()?.currentUser?.displayName ?? ""
        chatController.friendId = messagesArray[indexPath.row].userId
        chatController.userName = messagesArray[indexPath.row].name
    }

有什么问题? 我尝试了另一种方式。我声明了两个变量并试图从这里开始行动:

var userId:String!
var userName:String!      

func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {

    userId = messagesArray[indexPath.row].userId
    userName = messagesArray[indexPath.row].name
    self.performSegueWithIdentifier("toChat2", sender: self)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "toChat2" {

        guard let navController = segue.destinationViewController as? UINavigationController,
        let chatController = navController.viewControllers.first as? ChatViewController else { return }

        chatController.senderId = FIRAuth.auth()?.currentUser?.uid
        chatController.senderDisplayName = FIRAuth.auth()?.currentUser?.displayName ?? ""
        chatController.friendId = userId
        chatController.userName = userName
    }
}

但是通过这种方式它可以工作但不正确,在单击表视图中的一个项目而没有响应之后,只有从第二次单击它才会移动但是只有第一次点击的数据! :)如何解决?

2 个答案:

答案 0 :(得分:1)

之前我已经做过了!您正在使用DES DESELECT行而不是SELECT行。

无论哪种方式,你都不应该在准备segue时强制解开这些变量。您可以使用另一个guard语句来获取indexPathsForSelectedRows。这样你至少不会崩溃。

答案 1 :(得分:0)

这是因为你在第二个例子中使用的是didDeselectRow而不是didSelectRow :)。因此,将tableView(didDeselectRow)更改为tableView(didSelectRow)并解决发送错误数据的问题。

希望它会对你有所帮助。