21

Szukałem na SO dla przykładów za pomocą klawisza wartość obserwując ze związkiem NSArray (lub NSMutableArray) i widocznie trzeba użyć NSArrayController (który w przeciwieństwie KVO ja nie znam), ale Nie znalazłem konkretnych przykładów, jak to zrobić. Czy ktoś może wyjaśnić za pomocą przykładowego kodu?Key Value Obserwując z NSArray

Na przykład, jeśli mam GameModel, który reprezentuje jego nazwy graczy z NSArray (playerNameArray) z NSStrings. Chcę obserwować te ciągi (kontroler widoku obserwuje dane modelu), aby zaktualizować różne rzeczy w widoku.

Jak mogę otrzymać powiadomienie o zmianie tablicy nazw graczy?

EDIT: Czy pakiet SDK dla systemu iOS obsługuje nawet NSArrayController? Jeśli nie, czy istnieje inny sposób?

Odpowiedz

30

Nie potrzebujesz kontrolera NSArrayController, aby obserwować zmiany w NSArray. Nie można jednak bezpośrednio obserwować tych zmian, tzn. Nie można wywoływać numeru -addObserver:forKeyPath:options:context: bezpośrednio pod numerem NSArray. W twoim przypadku chcesz go nazwać na klawiaturze GameModel z @"playerNameArray" jako klawiszem.

Jeszcze nie skończyłeś. Normalne automatyczne powiadomienia KVO będą uruchamiane tylko wtedy, gdy zadzwonisz pod numer -setPlayerNameArray:, zastępując w ten sposób całą tablicę. Jeśli potrzebujesz bardziej szczegółowych powiadomień, musisz użyć -willChange:valuesAtIndexes:forKey: i -didChange:valuesAtIndexes:forKey:, gdy wstawisz, usuniesz lub zamienisz elementy w tej tablicy.

Spowoduje to wysłanie powiadomienia za każdym razem, gdy zmieni się zawartość tablicy. W zależności od tego, czy korzystasz z dodawanego obserwatora, możesz również uzyskać przyrostowe zmiany - fajna funkcja, ale w tym przypadku może nie być potrzebna.

Uwaga: NSArrayController nie istnieje na iOS. To część Cocoa Bindings, która obecnie istnieje tylko w AppKit na Mac OS X. Na szczęście nie potrzebujesz tego.

+0

Próbowałem dokładnie tego ustawienia na iOS-4, i nic się nie stało (oba wywołania zwrotne zostały zaimplementowane, dzięki autouzupełnianiu Xcode, więc jestem pewien, że zostały poprawnie wpisane.) Sprawdziłem, czy wszystkie zaangażowane obiekty mają wartość inną niż null, wszystko sprawdzono ponownie za pomocą punkty przerwania). Czy Apple to usunął? – Adam

+0

Nie są to oddzwonienia - musisz zadzwonić do nich, aby uzyskać regularne KVO w kolekcji do pracy. –

+4

@Adam mówi, że musisz napisać własne narzędzia do NSMutableArray i samodzielnie wypalić notatki KVO. – jpswain

Powiązane problemy