Удалить строку из 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