5

Ich habe eine UITableView von Core Data mit einem NSFetchedResultsController gefüttert, die die Standorteinheiten zurückgibt. Die Standardsortierung (und Abschnittsüberschriften) erfolgt über den ersten Buchstaben des Entitätsnamens. Das funktioniert (obwohl ich immer noch versuche, Groß- und Kleinschreibung korrekt in denselben Abschnitt zu kombinieren). Der Benutzer kann die Tabelle nach einer von drei optionalen Kategorien sortieren (die Attribute der Entität sind), und dann werden diese Kategorien sortiert nach dem Namen der Entität.Sortierdeskriptoren mit NSFetchedResultsController - Swift

Als ich die Sortierung nach Kategorie stelle ich die folgenden Laufzeitfehler erhalten:

[_TtCSs23_ContiguousArrayStorage00007F80513B59D0 key]: unrecognized selector sent to instance 0x7f80513b5720 

Das ist mein NSFetchedResultsController:

var sectionNameKeyPathString1: String? 
var sectionNameKeyPathString2: String? 

var fetchedResultsController: NSFetchedResultsController { 
    if _fetchedResultsController != nil { 
     return _fetchedResultsController! 
    } 

    let fetchRequest = NSFetchRequest() 
    // Edit the entity name as appropriate. 
    let entity = NSEntityDescription.entityForName("Location", inManagedObjectContext: self.managedObjectContext!) 
    fetchRequest.entity = entity 

    // Set the batch size to a suitable number. 
    fetchRequest.fetchBatchSize = 20 

    // Edit the sort key as appropriate. 
    if sectionNameKeyPathString1 != nil { 
     let sortDescriptor1 = NSSortDescriptor(key: sectionNameKeyPathString1!, ascending: true) 
     let sortDescriptor2 = NSSortDescriptor(key: sectionNameKeyPathString2!, ascending: true) 
     let sortDescriptors = [sortDescriptor1, sortDescriptor2] 
     fetchRequest.sortDescriptors = [sortDescriptors] 
    } else { 
     let sortDescriptor = NSSortDescriptor(key: "locationName", ascending: true) 
     fetchRequest.sortDescriptors = [sortDescriptor] 
    } 

    var sectionNameKeyPath: String 
    if sectionNameKeyPathString1 == nil { 
     sectionNameKeyPath = "firstLetterAsCap" 
    } else { 
     sectionNameKeyPath = sectionNameKeyPathString1! 
    } 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext!, sectionNameKeyPath: sectionNameKeyPath, cacheName: "Locations") 
    aFetchedResultsController.delegate = self 
    _fetchedResultsController = aFetchedResultsController 

    var error: NSError? = nil 
    if !_fetchedResultsController!.performFetch(&error) { 
     // TODO: Handle this error 
     // Replace this implementation with code to handle the error appropriately. 
     // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     //println("Unresolved error \(error), \(error.userInfo)") 
     abort() 
    } 

    return _fetchedResultsController! 
} 

Haltepunkte verwenden Ich bin zuversichtlich, dass zum Beispiel sectionNameKeyPathString1 = " category1 "und sectionNameKeyPathString2 =" locationName "und auch der sectionNameKeyPath =" category1 ", damit der Schlüsselpfad mit dem ersten Sortierdeskriptor übereinstimmt.

Ich hatte dies in Obj-C funktioniert, aber jetzt ziehe ich meine Haare aus und sicher, dass ich unter Blindheit leiden.

Antwort

10

Haben Sie einfach zu viele []?

let sortDescriptors = [sortDescriptor1, sortDescriptor2] // <- an [NSSortDescriptor] 
    fetchRequest.sortDescriptors = [sortDescriptors] // <- now an [[NSSortDescriptor]] 

sollte gerade sein:

fetchRequest.sortDescriptors = [sortDescriptor1, sortDescriptor2] 
+0

Sie meine Frage beantwortet, während ich noch es Bearbeitung wurde. Vielen Dank! Ich akzeptiere deine Antwort, wenn das Zeitlimit abgelaufen ist. Ich bin so glücklich, dass die Leute mich anstarren. – Magnas

+0

Das ist so komisch, das gleiche ist mir passiert! Muss versehentlich eine eckige Klammer doppelt angetippt haben und nicht bemerkt haben, weil ich die Deskriptoren im Arrayinitialisierer initialisiert habe und ich bin zu sehr daran gewöhnt, Methoden wie diese in eckigen Klammern von ObjC setzen zu müssen. – Ash

Verwandte Themen