准备segue时,致命错误指数超出范围

问题描述 投票:0回答:1

我执行“ 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)
                    }
                }
            }
        }
    })
}
ios swift uitableview struct indexoutofboundsexception
1个回答
0
投票

来自@ 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
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.