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
}
}
但是通过这种方式它可以工作但不正确,在单击表视图中的一个项目而没有响应之后,只有从第二次单击它才会移动但是只有第一次点击的数据! :)如何解决?
答案 0 :(得分:1)
之前我已经做过了!您正在使用DES DESELECT行而不是SELECT行。
无论哪种方式,你都不应该在准备segue时强制解开这些变量。您可以使用另一个guard语句来获取indexPathsForSelectedRows。这样你至少不会崩溃。
答案 1 :(得分:0)
这是因为你在第二个例子中使用的是didDeselectRow
而不是didSelectRow
:)。因此,将tableView(didDeselectRow)更改为tableView(didSelectRow)并解决发送错误数据的问题。
希望它会对你有所帮助。