2016-07-28 2 views
0

Я использую следующий код, чтобы удалить строку из 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», причина: «Применение пыталось представить модально активный контроллер

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

+0

Используете ли вы методы делегата 'NSFetchedResultsController', и если да, то называются ли вообще методы? – vadian

+0

какие методы вы используете. когда код без предупреждения, все в порядке, и удаленная строка исчезнет, ​​а исчезнет. Когда используется предупреждение, код не вызывает контроллерDidChangeContent и controllerWillChangeContent и методы управления вообще. – Milligator

ответ

0

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

managedObjectContext.deleteObject(subjectToDelete) 
yourTableView.reloadData() 

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

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

Когда я использую код без предупреждения, все работает нормально. Когда я использую код с предупреждением, проблема начинается. – Milligator

0

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

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

P.S. извините, ответ плохо написан. Я пользуюсь своим телефоном.

0

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

+0

Я не понимаю, что вы имеете в виду дважды. Не могли бы вы объяснить больше? – Milligator

+0

Эта строка: 'presentViewController (confirmDelete, animated: true, completion: noil)' вызывается два раза в том же методе, вы пытаетесь представить контроллер, который уже представлен – juanjo

+0

, который вы пишете. Я сделал это неправильно. – Milligator

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