Ho un UITableView
alimentato da Core Data
con un NSFetchedResultsController
che restituisce le entità di posizione. L'ordinamento predefinito (e le intestazioni di sezione) avviene tramite la prima lettera del nome dell'entità. Funziona (anche se sto ancora cercando di combinare correttamente maiuscolo e minuscolo nella stessa sezione.) L'utente può scegliere di ordinare la tabella in base a una delle tre categorie opzionali (che sono attributi dell'entità) e quindi queste categorie sono ordinate dal nome dell'entità.Descrittori di ordinamento con NSFetchedResultsController - Swift
Quando ho creato per l'ordinamento per categoria ottengo il seguente errore di runtime:
[_TtCSs23_ContiguousArrayStorage00007F80513B59D0 key]: unrecognized selector sent to instance 0x7f80513b5720
Questo è il mio 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!
}
Utilizzando i punti di interruzione Sono fiducioso che, per esempio, sectionNameKeyPathString1 = " category1 "e sectionNameKeyPathString2 =" locationName "e anche that sectionNameKeyPath =" category1 "in modo che il percorso della chiave corrisponda al primo descrittore di ordinamento.
Ho avuto questo lavoro in Obj-C ma ora sto tirando i capelli e sono sicuro di soffrire di cecità.
Hai risposto alla mia domanda mentre ero ancora a modificarla. Grazie! Accetterò la tua risposta quando il limite di tempo è scaduto. Sono così felice che le persone mi stanno fissando. – Magnas
È così strano, lo stesso è successo a me! Deve avere una parentesi quadra doppia battuta per sbaglio e non se ne è accorto a causa dell'inizializzazione dei descrittori all'interno dell'inizializzatore di array e dell'essere troppo abituata a dover mettere i metodi in parentesi quadre da ObjC. – Ash