【问题标题】:Crash when deleting the last row of a UITableView删除 UITableView 的最后一行时崩溃
【发布时间】:2015-09-16 15:55:17
【问题描述】:

当我删除 UITableView 的最后一行时,我收到一个 lldb 错误,而没有其他消息。这是我的代码:

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]?  {
    if tableView == sendTableView {
        return []
    } else {
        //delete row
    let deleteRow = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in
        self.oId = globalClass.messageObjects[indexPath.row].objectId!!
        self.messageToDelete = globalClass.messageObjects[indexPath.row]["fromFriend"] as! String
        globalClass.messageObjects.removeAtIndex(indexPath.row)
        self.myMap.removeAnnotation(self.pinAnnotationArray[indexPath.row])
        self.pinAnnotationArray.removeAtIndex(indexPath.row)
        self.messageTableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade)
        self.deleteMessage()
    })
        //get directions
...
        return [deleteRow,getDirections]
    }
}


//delete message
func deleteMessage() {
        _ = PFQuery(className:"Messages")
        let query = PFQuery(className:"Messages")
        query.getObjectInBackgroundWithId(oId){ (object: PFObject?, error: NSError?) -> Void in

            if error == nil && object != nil {
                    if self.messageToDelete == PFUser.currentUser()?.username {
                        object!.deleteInBackgroundWithBlock({ (Bool, error) -> Void in
                    })
                 } else {
                    let wanted:PFObject = object as PFObject!
                        if wanted["wanted"] as! Bool == true {
                            if self.newMessages.count > 1 {
                                self.newMessages.removeLast()
                                self.newMessagesNumber.text = "\(self.newMessages.count)"
                            } else {
                                self.newMessages = []
                                self.newMessagesNumber.hidden = true
                            }
                            wanted["wanted"] = false
                            wanted.saveInBackgroundWithBlock{(success, error) -> Void in
                                if success == false {
                                } else {
                                    let currentInstallation:PFInstallation = PFInstallation.currentInstallation()
                                    currentInstallation.badge = self.newMessages.count
                                    currentInstallation.saveEventually()
                                }
                            }
                        }
                }
            }
    }
}

对象在崩溃前被删除,UITableView 似乎被重新加载。什么可能导致此崩溃?

【问题讨论】:

  • 那么,异常断点捕获了什么异常?
  • 当我添加异常断点时,日志中什么都没有。
  • 那你怎么知道它崩溃了?
  • 所以。见过一个应用程序停止运行吗?这就是发生的事情。异常断点不会在日志中打印任何内容。
  • 等等!你得到一个 lldb 错误??所以你还没有建造这个东西?如果您查看构建日志,还有其他消息。

标签: swift uitableview lldb


【解决方案1】:

像这样更新您的代码以使其更好地工作-

let deleteRow = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in

    self.messageTableView.beginUpdates()

    //your code here

    self.messageTableView.endUpdates()
})

【讨论】:

  • 感谢您的建议!但这并不能解决问题。