2017-10-27 43 views
5

Używam NSFetchedResultsController do grupowania według sekcji, w których sectionNameKeyPath jest zgodnie z kategorią.Zmiana kolejności sortowania bez względu na sectionNameKeyPath w NSFetchedResultsController

Moje kategorie to: Dorosły, Dziecko, Wizja, Brak.

porządek malejący porządek: Dorosły, Dziecko, None, Vision

malejący porządek: Vision, None, Dziecko, Dorosły

Chcę Żadna kategoria przyjść w końcu zawsze, niezależnie od kolejności sortowania.

rosnący pożądany rodzaj: Dorosły, Dziecko, Vision, None

Malejąco żądany rodzaj: Vision, dziecko, dorosły, żaden

Code jest następująca:

let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedOC, sectionNameKeyPath: "category", cacheName: nil) 

Odpowiedz

0

myślę od przechowujesz kategorię jako ciąg, a wartość ciągu może sortować tylko w kolejności alfabetycznej. Czy to możliwe, jeśli można utworzyć pole numeryczne w bazie danych? Przechowuj wartości numeryczne, takie jak Adult = 1, Child = 2, Vision = 3, None = 4, Dzięki temu możesz łatwo porządkować i sortować dane w porządku rosnącym lub malejącym. Mam nadzieję, że to ci pomoże.

+0

Ale w przypadku malejącej kolejności również NONE powinno być ostatnim elementem. – Soumen

+0

Możesz zrobić najpierw pobrać dane "Adult = 1, Child = 2, Vision = 3" w porządku sortowania i zapisać na liście # 1. Następnie pobierz tylko element "Brak" i zapisz na liście nr 2, a następnie połącz obie listy. – Waseem

0

Jeśli chcesz zmodyfikować model CoreData, możesz utworzyć nowy podmiot do reprezentowania kategorii. Jednostka Category ma trzy atrybuty: name (string), ascOrder (Integer 16) i descOrder (Integer 16). Następnie (jako jednorazowego zadania) tworzą cztery Category przedmioty o wartości co następuje:

name  ascOrder descOrder 
====  ======== ========= 
Adult  1   3 
Child  2   2 
Vision  3   1 
None  4   4 

Wymień atrybut swojej jednostki category z (do jednego) związek z Category. Odwrotna relacja powinna być dla wielu. Zamiast ustawiać wartość atrybutu na przykład "Dorosły", należy ustawić relację z obiektem Category przy użyciu opcji "Dorosły" pod numerem name. Następnie możesz skonfigurować swój FRC do sortowania obiektów według klucza category.ascOrder lub category.descOrder i podać odpowiednie sectionNameKeyPath.

Wynik będzie taki, że stolik zostanie zgrupowany w sekcje i posortowany poprawnie. Jednakże, ponieważ sectionNameKeyPath jest ascOrder (lub descOrder), właściwość sekcji name będzie 1,2,3 lub 4, a nie "Dorosły", "Dziecko" itp. Aby to naprawić, w metodzie tableView titleForHeaderInSection lub viewForHeaderInSection, nie stosować:

let sectionInfo = self.fetchedResultsController.sections![section] 
let sectionName = sectionInfo.name 

ale zamiast otrzymać nazwę przez przejeżdżające relację z pierwszej pozycji w dziale:

let sectionInfo = self.fetchedResultsController.sections![section] 
let firstItem = sectionInfo.objects![0] as! YourEntity 
let sectionName = firstItem.name 

może być podobne problemy z tytułami indeksu, jeśli używasz indeksów .

Jeśli Twoja aplikacja jest już dostępna, jedną z wad tej metody będzie konieczność przeprowadzenia migracji Twoich danych. Nie pamiętam, czy mała migracja jest w stanie zastąpić atrybut relacją do nowego podmiotu; Zostawiam to Tobie, aby zbadać sprawę.