从按钮swift中删除uitableview中的最后一个单元格

时间:2015-08-12 06:44:30

标签: ios swift uitableview parse-platform

我的tableview单元格上有一个接受和拒绝按钮。当用户单击拒绝按钮时,它将从解析中删除数据以及重新加载表。但是,当我到达最终请求时,点击拒绝会从Parse中删除数据,但是单元格不会消失。

上下文 我有一个名为var requests = [PFObject]()

的PFObject数组

这是我的按钮代码

在我的cellForRowIndexPath

 cell.declineBtn.addTarget(self, action: "declineRequest:", forControlEvents: .TouchUpInside)

然后我实现了函数declineRequest

func declineRequest(sender: UIButton) {
    var cell: NotificationsTableViewCell = sender.superview!.superview as! NotificationsTableViewCell 

    let indexPath = self.tableView.indexPathForRowAtPoint(cell.center)!

    let innerP1 = NSPredicate(format: "sender = %@ AND postId = %@ ", cell.requesterEmailLabel.text! , cell.postIdLabel.text!)

    var innerQ1: PFQuery = PFQuery(className: "Requests", predicate: innerP1)
    var query = PFQuery.orQueryWithSubqueries([innerQ1])

    query.getFirstObjectInBackgroundWithBlock{
         (object:AnyObject? , error:NSError?) -> Void in
          if(error == nil){
          object!.deleteInBackground(); 
          loadNotifications(); // self.tableView.reloadData() is in this call
      }
    }
  }                   
}

我需要以某种方式告诉表格数据数组是空的。 如果我需要添加更多上下文,请告诉我。我不是试图使用commitEditingStyle editingStyle,而是希望按钮来处理删除。

编辑#2 尝试使用块在后台删除后,数据仍会被删除,但表视图仍然不会删除表视图中剩余的最后一行。

这是代码

 query.getFirstObjectInBackgroundWithBlock{
         (object:AnyObject? , error:NSError?) -> Void in
          if(error == nil){
            object!.deleteInBackgroundWithBlock {(success: Bool, error: NSError?)-> Void in
            if (success) {
                self.loadNotifications()

                println("Load Notifications")
            }
            else {
                println("cannot delete")
            }
        }
    }
}

3 个答案:

答案 0 :(得分:1)

如果您确认您的数据库删除本身在tableview上下文之外工作,我怀疑竞争条件,即删除是异步的(object!.deleteInBackground();)并且在将查询提交到解析后端后立即出现重新加载,因此比删除交易的佣金。

考虑使用– deleteInBackgroundWithBlock:https://parse.com/docs/ios/api/Classes/PFObject.html#//api/name/deleteInBackgroundWithBlock :)。 这样一旦查询被(un-)成功执行,就会调用回调,从而促进有效的重新加载。

答案 1 :(得分:1)

在删除时只使用完成块,因为您的表视图重新加载正在主线程中发生并且删除发生在后台线程中,这可能会因网络延迟而导致延迟,这是导致单元格在那里的原因删除后。

是的,这段代码是在客观C中,因为我对Swift并不熟悉: -

[object deleteInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (succeeded) {
            //reload data now
           }

答案 2 :(得分:-1)

我找到了解决方案,这对我有用。关键是要添加以下代码。

    self.requests.removeAtIndex(indexPath.row)
    self.notificationImages.removeAtIndex(indexPath.row)
    self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade)
    self.tableView.reloadData()

其中,请求和notificationImages都是我存储请求信息的阵列,以及其他用户图像。一旦我在索引路径上删除它们,它就不会在最后一个单元格上失败。

func declineRequest(sender: UIButton) {
    var cell: NotificationsTableViewCell = sender.superview!.superview as! NotificationsTableViewCell
    let indexPath = self.tableView.indexPathForRowAtPoint(cell.center)!
    let innerP1 = NSPredicate(format: "sender = %@ AND postId = %@ ", cell.requesterEmailLabel.text! , cell.postIdLabel.text!)
    var innerQ1: PFQuery = PFQuery(className: "Requests", predicate: innerP1)
    var query = PFQuery.orQueryWithSubqueries([innerQ1])
    self.requests.removeAtIndex(indexPath.row)
    self.notificationImages.removeAtIndex(indexPath.row)
    self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade)
    self.tableView.reloadData()
        query.getFirstObjectInBackgroundWithBlock{
            (object:AnyObject? , error:NSError?) -> Void in
            if(error == nil){
                object!.deleteInBackgroundWithBlock {(success: Bool, error: NSError?)-> Void in
                    if (success) {
                        println("request deleted")

                    }
                    else {
                        println("cannot delete")
                    }
                }
            }
        }
    }