2016-04-09 25 views
1

Kullanıcıya UITableView numaralı veriyi gösteren ve kullanıcının yeni bir varlık eklemesini sağlayan çok basit bir NSFetchedResultsController var. AncakNSFetchedResultsController ekleri (veya güncelleştirmeleri görmez)

, ben yeni bir varlık eklediğinizde, aşağıdaki iletiyle benim uygulama kilitleniyor (veya bazen sadece uyarıyor): hatta numberOfRows 2'den 3'e güncellendi düşünce

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 (3) must be equal to the number of sections contained in the table view before the update (2), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted). with userInfo (null) 

Bildirim, ekleme/silme işlemi hala (0 inserted, 0 deleted) diyor. En iyi anlayışım, NSFetchedResultsController'un, değişiklikleri veya bir şeyi fark etmemesidir.

NSFetchedResultsController Benim kodudur:

func fetch(frcToFetch: NSFetchedResultsController) { 

    do { 
     try frcToFetch.performFetch() 
    } catch { 
     return 
    } 
} 

func fetchRequest() -> NSFetchRequest { 

    // Initialize Fetch Request 
    let fetchRequest = NSFetchRequest(entityName: "ItemInfo") 

    // Add Sort Descriptors 
    let nameSortDescriptor = NSSortDescriptor(key: "iName", ascending: true) 
    fetchRequest.sortDescriptors = [nameSortDescriptor] 

    return fetchRequest 
} 


func getFRC() -> NSFetchedResultsController { 

    if let context = self.context{ 
     fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: context, sectionNameKeyPath: "iName.stringGroupByFirstInitial", cacheName: nil) 
     fetchedResultsController.delegate = self 
    } 
    return fetchedResultsController 
} 

func controllerWillChangeContent(controller: NSFetchedResultsController) { 
    tableView.beginUpdates() 
} 

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

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 { 
      let cell = tableView.cellForRowAtIndexPath(indexPath)! as UITableViewCell 
      configureCell(cell, atIndexPath: indexPath) 
     } 
     break; 
    case .Move: 
     if let indexPath = indexPath { 
      tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
     } 

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

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    if let sections = fetchedResultsController.sections { 
     return sections.count 
    } 

    return 0 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if let sections = fetchedResultsController.sections { 
     let sectionInfo = sections[section] 
     return sectionInfo.numberOfObjects 
    } 

    return 0 
} 

Ve yeni bir kayıt eklemek için kod:

let entity: NSEntityDescription.entityForName("ItemInfo", inManagedObjectContext: self.context!)! 

let record = NSManagedObject(entity: entity, insertIntoManagedObjectContext: self.context!) 

record.setValue(name, forKey: "iName") 
record.setValue(self.billingMode.text, forKey: "iBillingMode") 

do { 
      // Save Record 
      try record.managedObjectContext?.save() 
      try self.context!.save() 
      // Dismiss View Controller 
      dismissViewControllerAnimated(true, completion: nil) 

     } catch { 
      let saveError = error as NSError 
      print("\(saveError), \(saveError.userInfo)") 

      // Show Alert View 
      showAlertWithTitle("Unexpected Error", message: "Your data could not be saved. Please try again later.", cancelButtonTitle: "Done") 
     } 

self.context değişken vardır fiili veya ana görünümü denetleyicisi geçirilen Not olduğunu NSFetchedResultsController.

+0

Uygulamanızı silmeyi ve yeniden çalıştırmayı denemek ister misiniz? – Khuong

+0

Eh, çok fazla veri içerdiğinden uygulamayı silemiyorum. Bir güncellemenin ortasındayım ve şu anda yedekleme işlevi bozuk. Yani silmek bir seçenek değildir. Build Folder'ı temizlemeye çalıştım ve koşuyorum ama sorun hala devam ediyor. –

+2

Sorunun * bölüm sayısı * ile değil, * bölüm sayısı * olduğunu unutmayın. - (void) kontrolörünü uyguladınız mı: (NSFetchedResultsController *) controller didChangeSection: (id ) sectionInfo'? – pbasdf

cevap

0

Sorun, bölüm numaralı satır sayısı numaralı satır sayısı ile ilgili olduğunu unutmayın. Uygulamanız gerekir:

(void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo