Próbuję nieco lepiej zrozumieć mechanizm kodowania wartości klucza (KVC) firmy Cocoa. Przeczytałem numer Key-Value Programming Guide firmy Apple, ale nadal jestem nieco zdezorientowany tym, jak niektóre metody KVC szukają kluczy. W szczególności mutableArrayValueForKey:.Jaki jest wzór wyszukiwania KVC dla mutableArrayValueForKey?
Poniżej wyjaśnię, jak rozumiem, że "gettery" KVC działają. Następnie przejdę do mojego pytania dotyczącego mutableArrayValueForKey.
Istnieje siedem różnych "Getter" Metody KVC:
- (id)valueForKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys;
- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;
- (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath;
- (NSMutableSet *)mutableSetValueForKey:(NSString *)key;
- (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath;
Podczas poszukiwania Wartość wewnątrz posesji (o nazwie MyKey), docs Apple członkowskiego, które valueForKey: wyszukiwań jak ten :
- Próbuje
-getMyKey
,-myKey
i-isMyKey
(w tej kolejności) wewnątrz odbiornika Jeśli nie znaleziono, to Próby te zamawiane, do wielu getters (NSArray):
// Required: - (NSUInteger)countOfMyKey; // Requires At Least One: - (id)objectInMyKeyAtIndex:(NSUInteger)index; - (NSArray *)myKeyAtIndexes:(NSIndexSet *)indexes; // Optional (improves performance): - (void)getMyKey:(KeyClass **)buffer range:(NSRange)inRange;
Następnie próbuje te nieuporządkowane, do wielu pobierające (NSSet) :
- (NSUInteger)countOfMyKey; - (NSEnumerator *)enumeratorOfMyKey; - (KeyClass *)memberOfMyKey:(KeyClass *)anObject;
Następnie próbuje uzyskać dostęp do zmiennych instancji bezpośrednio, zakładając
YES
jest zwracany przezaccessInstanceVariablesDirectly
, w następującej kolejności:_myKey
,_isMyKey
,myKey
,isMyKey
.Na koniec poddaje się i wywołuje metodę klasy przyjmującej:
- (id)valueForUndefinedKey:(NSString *)key
. Zwykle tutaj powstaje błąd.
Moje pytanie brzmi, jaki jest wzór porządek poszukiwanie mutableArrayValueForKey :?
Accessor Szukaj Wzór dla zamówionych Kolekcje
Wzór domyślną wyszukiwarką dla mutableArrayValueForKey: jest jako następująco:
klasy odbiornika jest poszukiwany przez pary metod, których nazwy pasują do wzorców -insertObject: inAtIndex: i -removeObjectFromAtIndex: (odpowiadające NSMutableArray prymitywnych sposobów insertObject: atIndex a removeObjectAtIndex:), lub metody dopasowania wzorca -WSTAW: atIndexes a -removeAtIndexes: (odpowiadające NSMutableArrayinsertObjects: atIndexes : i removeObjectsAtIndexes: methods). Jeżeli co najmniej jeden sposób wkładania i co najmniej jeden sposób usuwania można znaleźć każda wiadomość NSMutableArray wysyłane do obiektu proxy kolekcja wynik jako kombinacja -insertObject: inAtIndex :, -removeObjectFromAtIndex :, -WSTAW: atIndexes: i -removeAtIndexes: wiadomości wysyłane do oryginalnego odbiorcy mutableArrayValueForKey :. ... itd ...
To nie ma dla mnie sensu, ponieważ omawia metody "setera". mutableArrayValueForKey:
zwraca wartość NSMutableArray. Wszystkie wymienione powyżej metody zwróciły nieważne i są używane do edycji obiektu NSMutableArray, ale go nie otrzymują. Przykład:
- (void)insertMyKey:(KeyClass *)keyObject inMyKeyAtIndex:(NSUInteger)index;
- (void)removeObjectFromMyKeyAtIndex:(NSUInteger)index;
Jakieś pojęcie, co Apple próbuje powiedzieć w swoich dokumentach, a może to błąd?
Moja teoria jest taka, że mutableArrayValueForKey:
prawdopodobnie podąża podobną ścieżką, co valueForKey:
podczas wyszukiwania w celu uzyskania wartości KVC. Po prostu nie jestem pewien, jaka to naprawdę jest ścieżka.
Dzięki za pomoc, jaką możesz zaoferować! :)
Dzięki Brian, to było bardzo pomocne. :) –
"Ten fragment kodu dodaje ścieżkę do początku playlisty", myślę, że dodaje utwór na początku utworów, a nie na playlistę? –
jest istotne, aby powiedzieć, że to podejście jest istotne, gdy używane są wiązania. W powyższym przykładzie, jeśli Playlist jest NSArrayController związany z tablicą śladów i mamy NSTableView związany z tym kontrolerem, to aby zmiany w ścieżkach mogły być odzwierciedlone w tabeli za pośrednictwem kontrolera tablicowego, musimy uzyskać ścieżki od zmiennej array proxy, a następnie dodaj/usuń obiekty na tej ścieżce: infact te operacje będą odzwierciedlały polecenia KVC, które wyzwalą mechanizm bindowania. – viggio24