Удалить строку из UITableview

Я использую следующий код для удаления строки из UITableView.

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        let personToDelete = self.fetchResultController.objectAtIndexPath(indexPath) as! Person

        if let managedObjectContext = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext {

            managedObjectContext.deleteObject(personToDelete)

            do{
                try managedObjectContext.save()
            } catch {
                print(error)
            }
        }
    }
}

и все работает нормально, когда я добавляю предупреждение к коду, удаленная строка останется в tableView.

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {

        let personToDelete = self.fetchResultController.objectAtIndexPath(indexPath) as! Person

        let confirmDelete = UIAlertController(title: "Remove Person", message: "Are you sure to delete \"\(personToDelete.name!)\" and all of its data.", preferredStyle: .ActionSheet)

        presentViewController(confirmDelete, animated: true, completion: nil)

        let deleteAction = UIAlertAction(title: "Delete", style: .Destructive, handler: { (action : UIAlertAction) in

            if let managedObjectContext = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext {

                managedObjectContext.deleteObject(subjectToDelete)

                do {
                    try managedObjectContext.save()
                } catch {
                    print(error)
                }
            }
        })
        let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: { (action : UIAlertAction) in        
        })

        confirmDelete.addAction(deleteAction)
        confirmDelete.addAction(cancelAction)
        presentViewController(confirmDelete, animated: true, completion: nil)
    }
}

Я попытался отладить, используя некоторые точки останова на beginUpdates и endUpdates. но, кажется, когда я использую оповещение, они не будут вызваны.

func controllerDidChangeContent(controller: NSFetchedResultsController) {
    tableView.endUpdates()
    print("update ended")
}

func controllerWillChangeContent(controller: NSFetchedResultsController) {
    tableView.beginUpdates()
    print("update Started")
}

без строк печати tableView не имеет никаких изменений, если только не закрыть и не открыть представление. когда я добавляю строки печати, появляется ошибка

Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина: "Приложение попыталось представить модально активный контроллер

в чем проблема?

3 ответа

tableview не будет показывать обновления, пока вы не обновите их в потоке пользовательского интерфейса. для этого вызовите dispatch_async(), чтобы разместить вызов в главной очереди.

где бы вы ни удаляли (я полагаю, здесь из вашего основного объекта данных) сразу после этого напишите this- dispatch_async (dispatch_get_main_queue) {self.tableView.reloadData ()}

ps извините, ответ не очень хорошо написан. Я использую свой телефон.

Вам нужно перезагрузить tableView после удаления объекта из managedObjectContext

managedObjectContext.deleteObject(subjectToDelete)
yourTableView.reloadData()

И для анимации с действием удаления

yourTableView.beginUpdates()
managedObjectContext.deleteObject(subjectToDelete)
yourTableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
yourTableView.endUpdates()

Вы пытаетесь представить confirmDelete контроллер дважды, вы представляете его сразу после создания, а затем снова после добавления действий. вот почему вы получаете ошибку Application tried to present modally an active controller

Другие вопросы по тегам