【问题标题】:Delete last cell in uitableview from button swift从按钮快速删除uitableview中的最后一个单元格
【发布时间】:2015-08-12 06:44:29
【问题描述】:

我的表格视图单元格上有一个接受和拒绝按钮。当用户单击拒绝按钮时,它会从解析中删除数据并重新加载表。但是,当我到达最终请求时,点击拒绝会从 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")
            }
        }
    }
}

【问题讨论】:

    标签: ios swift uitableview parse-platform


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      是的,这段代码是在 Objective C 中,因为我不太熟悉 Swift:-

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

      【讨论】:

      • 所以我确实有一个 object.deleteInBackgroundWithBlock 替换为 object!.deleteInBackground() 但我有同样的问题,你的意思是块在 getFirstObjectInBackgroundWithBlock 之外?还是在里面?我需要先找到对象然后删除它吗?或者我可以马上做 query.deleteInBackgroundWithBlock 吗?
      • 我的意思是在 getFirstObjectInBackgroundWithBlock 内部,一旦错误为零,然后使用完成处理程序调用 [object deleteInBackgroundWithBlock,在该完成处理程序内重新加载数据。
      • 好吧,我再试一次,我以前试过,如果它不起作用,请更新我的源代码!让你知道
      • Vizllx 它仍然对我不起作用,它会删除所有其他行相同但在剩余行上它不会像其他行一样消失
      【解决方案3】:

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

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

      其中 requests 和 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")
                          }
                      }
                  }
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-23
        • 2018-02-06
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        相关资源
        最近更新 更多