2016-09-18 47 views
0

我有一个名为ToDoItem的实体。其中有三个属性:使用NSFetchedResultsController更新部分

@NSManaged var toDoString: String? 
@NSManaged var creationDate: NSDate? 
@NSManaged var isComplete: NSNumber? 

我试图创建一个NSFetchedResultsController将与因变量isComplete两段显示。我能做到这一点成功购买这样做:

lazy var fetchedResultsController: NSFetchedResultsController = { 

    let questionAnswerFetchRequest = NSFetchRequest(entityName: "ToDoItem") 

    let questionAnswerFetchSortDescriptor = NSSortDescriptor(key: "creationDate", ascending: false) 
    questionAnswerFetchRequest.sortDescriptors = [questionAnswerFetchSortDescriptor] 

    let frc = NSFetchedResultsController(
     fetchRequest: questionAnswerFetchRequest, 
     managedObjectContext: (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext, 
     sectionNameKeyPath:"isComplete", 
     cacheName: nil) 

    frc.delegate = self 
    return frc 
}() 

我还实施了删除方法是这样的:

// 
// MARK: Fetched Results Controller Delegate Methods 
// 
func controllerWillChangeContent(controller: NSFetchedResultsController) { 
    tableView.beginUpdates() 
} 

func controllerDidChangeContent(controller: NSFetchedResultsController) { 
    tableView.endUpdates() 
} 

func controller(controller: NSFetchedResultsController, 
       didChange sectionInfo: NSFetchedResultsSectionInfo, 
          atSectionIndex sectionIndex: Int, 
             for type: NSFetchedResultsChangeType) { 

    switch (type) { 
    case .Insert: 
     self.tableView.insertSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Fade) 
     break 
    case .Delete: 
     self.tableView.deleteSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Fade) 
     break 
    default: 
     break 
    } 

} 

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { 
    switch (type) { 
    case .Insert: 
     if let indexPath = newIndexPath { 
      tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
     } 
     break; 
    case .Delete: 
     if let indexPath = indexPath { 
      tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
     } 
     break; 
    case .Update: 
     if let indexPath = indexPath { 
      tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) 
     } 
     break; 
    case .Move: 
     if let indexPath = indexPath { 
      tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
     } 

     if let newIndexPath = newIndexPath { 
      tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Fade) 
     } 
     break; 
    } 
} 

的问题是,当我更新isComplete属性我得到这个错误:

CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. Invalid update: invalid number of sections. The number of sections contained in the table view after the update (1) must be equal to the number of sections contained in the table view before the update (0), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted). with userInfo (null)

我的理解什么这是说,我只是不明白为什么它导致该错误。我实现了每个文件的委托方法.....


我已经更新了我NSFetchedResultsController创造增加每@韦恩的回答另一个sortDescriptor像这样:

lazy var fetchedResultsController: NSFetchedResultsController = { 

     let questionAnswerFetchRequest = NSFetchRequest(entityName: "ToDoItem") 

     let isCompleteSortDescriptor = NSSortDescriptor(key: "isComplete", ascending: false) 
     let creationDateSortDescriptor = NSSortDescriptor(key: "creationDate", ascending: false) 

     questionAnswerFetchRequest.sortDescriptors = [isCompleteSortDescriptor, creationDateSortDescriptor] 

     let frc = NSFetchedResultsController(
      fetchRequest: questionAnswerFetchRequest, 
      managedObjectContext: (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext, 
      sectionNameKeyPath:"isComplete", 
      cacheName: nil) 

     frc.delegate = self 
     return frc 
    }() 

我已经增加了一些断点和事实证明,此委托方法永远不会被调用:

func controller(controller: NSFetchedResultsController, 
       didChange sectionInfo: NSFetchedResultsSectionInfo, 
          atSectionIndex sectionIndex: Int, 
             for type: NSFetchedResultsChangeType) { 

    switch (type) { 
    case .Insert: 
     self.tableView.insertSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Fade) 
     break 
    case .Delete: 
     self.tableView.deleteSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Fade) 
     break 
    default: 
     break 
    } 
} 

这是导致相同的错误张贴以上。任何想法,为什么这将永远不会被称为?

回答

3

您需要为isComplete添加排序描述符。它应该是第一个排序描述符,然后有你的日期。

基本上,排序和部分需要兼容,而你目前没有。

+0

您还应该确切地检查您得到的代表回调,因为您应该了解有关该部分的更新和补充,并且您可能会因此导致对视图进行误导性更新,因此组合更改很难在细节水平 – Wain

+0

我已更新任何问题。添加其他排序描述符无效:( – random

+0

你正在使用哪个版本的swift?看起来像func签名应该是'func controller(_control:NSFetchedResultsController,didChangeSection sectionInfo:NSFetchedResultsSectionInfo,atIndex sectionIndex:Int,forChangeType type: NSFetchedResultsChangeType)' – Wain

相关问题