Dies ist meine Message.swift
Datei einfügen:NSFetchedResultsController fügt die gleiche Zelle in zwei Abschnitte nur dann, wenn Controller über einen anderen Abschnitt
@objc(Message)
class Message: NSManagedObject {
@NSManaged var content: String
@NSManaged var createdAt: NSDate
@NSManaged var identifier: Int64
@NSManaged var conversation: Conversation
@NSManaged var sender: Contributor
var normalizedCreatedAt: NSDate {
return createdAt.dateWithDayMonthAndYearComponents()!
}
}
Dies ist, wie ich mein Setup FRC:
private func setupFetchedResultsController() {
let context = NSManagedObjectContext.MR_defaultContext()
let fetchRequest = NSFetchRequest(entityName: "Message")
let createdAtDescriptor = NSSortDescriptor(key: "createdAt", ascending: true)
fetchRequest.predicate = NSPredicate(format: "conversation.identifier = %lld", conversation.identifier)
fetchRequest.sortDescriptors = [createdAtDescriptor]
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: "normalizedCreatedAt", cacheName: nil)
fetchedResultsController.delegate = self
try! fetchedResultsController.performFetch()
tableView.reloadData()
}
mit seinen Standarddelegierter.
Auf viewDidLoad
hat mein Controller 1 Abschnitt mit 1 Zeile. Ich drucke es auf der Konsole mit der folgenden Funktion:
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("--->>>")
print(section)
print(fetchedResultsController.sections![section].objects!.count)
return fetchedResultsController.sections![section].objects!.count
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return fetchedResultsController?.sections?.count ?? 0
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let message = fetchedResultsController?.objectAtIndexPath(indexPath) as! Message
let cellIdentifier = message.sender.identifier == Settings.currentUser?.profile?.identifier ? SentTableViewCellIdentifier : ReceivedTableViewCellIdentifier
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! TableViewCell
cell.cellTitleLabel?.text = message.content
return cell
}
und der Ausgang ist folgende:
--->>>
0
1
Sobald ich versuche nur ONE eine weitere Nachricht mit unterschiedlichen Abschnitt hinzuzufügen, wird die folgende erhalte ich:
--->>>
0
2
--->>>
1
1
und dann der Fehler:
CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (2) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out). with userInfo (null)
Warum passiert es so?
NSFetchedResultsController
aus irgendeinem Grund lädt die gleiche Zelle in zwei Abschnitte: erste und zweiten. Warum?
HINWEIS:
- Das Problem entsteht nur, wenn FRC neuen Abschnitt einzufügen. Wenn Sie eine Zeile in den vorhandenen Abschnitt einfügen müssen, gibt es kein Problem. Problem ist stark in Bezug auf Abschnitte.
- Das Problem besteht nur, wenn FRC versuchen, einen zweiten Abschnitt einzufügen. Wenn es um den dritten oder vierten Abschnitt geht, gibt es überhaupt kein Problem.
können Sie bitte Code für 'numberOfSectionsInTableView' und' cellForRowAtIndexPath' hinzufügen? – D4ttatraya
Ja, ich habe die Frage aktualisiert. –
Code scheint gut, kein mehrdeutiger Ort. überprüfen Sie einfach 'createAt' Eigenschaft fühlt sich richtig und' dateWithDayMonthAndYearComponents() 'Methode funktioniert gut. – D4ttatraya