2016-07-28 3 views
0

다음 코드를 사용하여 UITableView에서 행을 삭제합니다. 내가 삭제 된 행이있는 tableView에 남아 코드에 경고를 추가 할 때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) 
      } 
     } 
    } 
} 

모든 것이 잘 작동합니다.

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

당신은 어떤 방법을 사용합니까? 코드에 경고가 없으면 모든 것이 잘되고 삭제 된 행은 사라집니다. 경고가 사용될 때 코드는 controllerDidChangeContent 및 controllerWillChangeContent 및 컨트롤러 메서드를 전혀 호출하지 않습니다. – Milligator

답변

0

당신은 당신이 삭제 작업에 managedObjectContext

managedObjectContext.deleteObject(subjectToDelete) 
yourTableView.reloadData() 

에서 그리고 애니메이션 개체를 삭제되면있는 tableView를 다시로드하는 데 필요한 업데이트 당신이 그것을 업데이트 해달라고 전까지 표시되지 않습니다

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() }

추신 삭제하는 곳 미안해. 대답이 잘 쓰여져 있지 않아. 내 전화를 사용하고있어.

0

confirmDelete 컨트롤러를 두 번 표시하려고하면 생성 직후에 표시 한 다음 동작을 추가 한 후 다시 표시합니다. 그래서 오류가 발생하는 이유는 무엇입니까? Application tried to present modally an active controller

+0

나는 당신이 두 번 의미하는 것을 이해하지 못합니다. 더 설명해 주시겠습니까? – Milligator

+0

다음 행 :'presentViewController (confirmDelete, animated : true, completion : nil)'이 동일한 메소드에서 두 번 호출되었으므로 이미 작성된 컨트롤러 – juanjo

+0

을 표시하려고합니다. 나는 그것을 잘못했다. – Milligator