2015-08-12 2 views
1

У меня есть кнопка accept и deny на моей ячейке tableview. Когда пользователь нажимает кнопку deny, он удаляет данные из разбора, а также перезагружает таблицу. Однако, когда я добираюсь до последнего запроса, нажатие deny удаляет данные из Parse, но ячейка не исчезает.Удалить последнюю ячейку в uitableview с кнопки swift

Для контекста У меня есть массив PFObject называется var requests = [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, вместо этого хочу, чтобы кнопка позаботилась об удалении.

EDIT # 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") 
      } 
     } 
    } 
} 

ответ

-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") 
        } 
       } 
      } 
     } 
    } 
1

Если вы убедились, что ваш сам дб удаление работает вне контекста Tableview я подозреваю, гоночные условия, т.е. удаление является асинхронным (object!.deleteInBackground();) и перезагрузки появляется сразу после подачи запроса к серверу синтаксического анализа, таким образом, быстрее, чем комиссия по транзакции удаления.

Рассмотрите возможность использования – deleteInBackgroundWithBlock: (https://parse.com/docs/ios/api/Classes/PFObject.html#//api/name/deleteInBackgroundWithBlock :). Таким образом, обратный вызов будет вызван после того, как запрос был успешно выполнен (un-), что облегчит эффективную перезагрузку.

1

Просто используйте блок завершения при удалении, так как перезагрузка таблицы отображается в основном потоке, и удаление происходит в фоновом потоке, что может вызвать задержку из-за латентности сети, это причина, по которой ячейка будет там после удаления.

Да этот код в объективном C, так как я не так хорошо знаком с Swift: -

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

так что я имел object.deleteInBackgroundWithBlock, который я заменил с объектом! .deleteInBackground(), но у меня была такая же проблема, вы имеете в виду для блока, чтобы быть вне getFirstObjectInBackgroundWithBlock? или внутри него? Нужно ли сначала найти объект и удалить его? или я могу выполнить query.deleteInBackgroundWithBlock сразу? – kareem

+0

Я имею в виду внутри getFirstObjectInBackgroundWithBlock, как только ошибка равна нулю, тогда вызовите [object deleteInBackgroundWithBlock с обработчиком завершения, внутри этого обработчика завершения перезагрузите данные. – Vizllx

+0

Хорошо, попробуйте еще раз, я пробовал это раньше, если он не работает плохо обновить мой исходный код! и дайте знать – kareem

Смежные вопросы