2013-02-25 10 views
10

W jaki sposób można powiązać zawartość NSArrayController z obiektami w relacji uporządkowanej do wielu?Powiązanie uporządkowanej relacji z NSArrayController

Mam nieuporządkowane do wielu relacji w moim modelu danych podstawowych, a NSArrayController, którego zestaw zawartości jest związany z tej relacji z jednostki nadrzędnej. Działa to dobrze, dane są dostępne z NSArrayController, bez problemu.

Podczas prac nad rozwojem zdecydowałem, że lepiej będzie umożliwić użytkownikom ręczną zmianę kolejności tych obiektów podrzędnych, dlatego zmieniłem relację na uporządkowaną. Teraz, kiedy mój NSArrayController jest tworzony z mojego stalówki następujący błąd jest prezentowany:

Cannot create NSSet from object Relationship '...' fault on managed object ... of class _NSFaultingMutableOrderedSet 

teraz rzeczywiście, myślę, że to wszystko ma sens: To uporządkowaną relacji, więc teraz jestem coraz uporządkowany zbiór. Związanie go z Content Array również byłoby niewłaściwe, ponieważ jest teraz NSOrderedSet, a nie tablicą. Moje pytanie brzmi: Teraz jak powiązać dane tego związku z powrotem z NSArrayController?

+0

Natknąłem się na ten problem i jestem całkiem przekonany, że to błąd z 'NSArrayController' - złożył raport o błędzie. – Vervious

+0

Wydaje się, na podstawie rozwiązania opisanego w odpowiedzi Hala, że ​​tak naprawdę nikt nie ma "prawdziwego" sposobu na powiązanie go. Zrobię również raport o błędzie, ponieważ IMO powinien być showstopper, obejść, czy nie. – Khakionion

Odpowiedz

8

Podstawowym problemem jest to, że uporządkowana relacja Core Data do wielu zwraca NSOrderedSet, a NSOrderedSet nie jest podklasą NSSet. Wszelkie powiązania kontrolera tablic, które oczekują NSSet, zawiodą.

Tom Fewster ma detailed blog post opisujące wykorzystanie NSValueTransformer do obejścia tego problemu, konwertując między NSOrderedSet i NSArray w locie. Zapewnia także sample implementation on Github.

+0

Dzięki! Jak wskazałem w ostatnim akapicie pytania, zdaję sobie sprawę, że dziedziczenie z NSSet (a raczej jego brak) jest problemem związanym z powiązaniami w obecnej sytuacji. Ale to podejście transformatora wartości jest ratunkiem życia! Na pewno się tym przyjrzę. – Khakionion

+3

Problem związany z obejściem (moim zdaniem) jest taki, że zmienne akcesory nie będą używane, co oznacza, że ​​każda zmiana oznacza ponowne przypisanie/ponowne ustawienie całego zestawu. – Vervious

9

Natknąłem się na tę dyskusję, sprawdzając, czy nastąpiły jakieś nowe wydarzenia na tym froncie. W aplikacji do wysyłki obecnie wiążę tablicę zawartości kontrolera tablic do [email protected] i działa dobrze, nie jestem pewna, czy sam to odkryłem, czy też ktoś ją gdzieś zasugerował.

+0

To jest zdecydowanie rozwiązanie. – Altimac

+2

Nie jestem pewien, czy to jest rozwiązanie, ponieważ operator "tablicy" wywołuje metodę "array" NSOrderSet, która zwraca obiekt tablicy "elewacji", który jest niezmienny przez projekt - (zobacz jego plik nagłówkowy w NSOrderSet.h). Oznacza to, że NSArrayController może "powiązać", ale nie dokona żadnych zmian w NSOrderedSet. To nie więcej niż połowiczne wiązanie. rozwiązanie tylko do odczytu. –

+0

rzeczywiście. Jeśli potrzebujesz mutability, to się nie powiedzie. Dobry połów;) – Altimac

Powiązane problemy