5

Mam UITableView karmione od Core Data przy pomocy zwracającej jednostki lokalizacji. Domyślne sortowanie (i nagłówki sekcji) odbywa się za pomocą pierwszej litery nazwy jednostki. Działa to (chociaż nadal staram się łączyć wielkie i małe litery w tę samą sekcję). Użytkownik może wybrać opcję uporządkowania tabeli według jednej z trzech opcjonalnych kategorii (które są atrybutami encji), a następnie kategorie te są sortowane według nazwy jednostki.Sortuj deskryptory za pomocą NSFetchedResultsController - Swift

Kiedy ustawiony na sortowanie według kategorii pojawia się następujący błąd wykonania:

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

To jest moje 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! 
} 

Korzystanie breakpoints Jestem przekonany, że, na przykład, sectionNameKeyPathString1 = " category1 "i sectionNameKeyPathString2 =" locationName ", a także sectionNameKeyPath =" category1 ", więc ścieżka klucza pasuje do pierwszego deskryptora sortowania.

Miałem to działa w Obj-C, ale teraz wyciągam włosy i jestem pewien, że cierpię na ślepotę.

Odpowiedz

10

Czy to po prostu zbyt wiele []?

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

powinny być po prostu:

fetchRequest.sortDescriptors = [sortDescriptor1, sortDescriptor2] 
+0

Odpowiedziałeś na moje pytanie, a ja wciąż edycji. Dziękuję Ci! Przyjmuję twoją odpowiedź, gdy limit czasu się skończy. Jestem taki szczęśliwy, że ludzie się na mnie gapią. – Magnas

+0

To takie dziwne, to samo stało się ze mną! Musi mieć przypadkowo podwójny gwintowany nawias kwadratowy i nie zauważyłem go z powodu inicjalizacji deskryptorów w inicjalizatorze macierzy i zbyt przyzwyczajenia się do umieszczania takich metod w nawiasach kwadratowych z ObjC. – Ash