我执行“ openChat” segue时每隔两次,就会收到致命错误提示:在此部分准备segue时索引超出范围:
chatThread[((tableView.indexPathForSelectedRow as NSIndexPath?)?.row)!]
chatThread是对ChatThread结构的引用。我将其初始化为:var chatThread = [ChatThread]()
代码
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "openChat" {
if let destination = segue.destination as? Conversation {
print("opening conversation")
print(destination)
print("destinationThread")
print(destination.chatThread)
print("currentThread")
print(chatThread[((tableView.indexPathForSelectedRow as NSIndexPath?)?.row)!])
destination.chatThread = chatThread[((tableView.indexPathForSelectedRow as NSIndexPath?)?.row)!]
}
}
}
表格视图代码
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let users = [PFUser.current()!.username!, self.friendStruct[indexPath.row].username!] as NSArray
let query = PFQuery(className: "ChatThread")
query.whereKey("users", containsAllObjectsIn: [users])
query.getFirstObjectInBackground(block: {(object, error) -> Void in
print("Found \(object)")
if object != nil {
// These users already have a thread
let threadId = object!.objectId!
let lockedBy = object!["lockedBy"] as? String
let lastSender = object!["lastSender"] as! String
let updatedAt = object!.updatedAt!
self.chatThread.append(ChatThread(threadId: threadId, lockedBy: lockedBy, users: users, lastSender: lastSender, updatedAt: updatedAt.timeAgoDisplay2(), otherUser: self.friendStruct[indexPath.row].username!, existingConversation: true))
DispatchQueue.main.async {
if self.shouldPerformSegue(withIdentifier: "openChat", sender: self){
self.performSegue(withIdentifier: "openChat", sender: self)
}
}
}else{
// Users never spoke
print("users never spoke")
DispatchQueue.main.async {
self.chatThread.append(ChatThread(threadId: nil, lockedBy: nil, users: users, lastSender: nil, updatedAt: nil, otherUser: self.friendStruct[indexPath.row].username!, existingConversation: false))
DispatchQueue.main.async {
if self.shouldPerformSegue(withIdentifier: "openChat", sender: self){
self.performSegue(withIdentifier: "openChat", sender: self)
}
}
}
}
})
}
来自@ rs7的解决方案。只需将chatThread[((tableView.indexPathForSelectedRow as NSIndexPath?)?.row)!]
更改为chatThread.last
,即可解决问题。
新代码
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "openChat" {
if let destination = segue.destination as? Conversation {
destination.chatThread = chatThread.last
}
}
}