2013-02-14 9 views
15

miałem właściwość o nazwie myName w mojej klasie, jak:Wyślij powiadomienie, gdy właściwość jest zmieniany Korzystanie KVO

@property (nonatomic, strong) NSString *myName; 

muszę wysłać powiadomienie, gdy wartość nieruchomości myName ulega zmianie.

Teraz robię coś takiego:

- (void)setMyName:(NSString *)name 
{ 
    _myName = name; 
    [[NSNotificationCenter defaultCenter] postNotificationName:CHANGE_NOTIFICATION object:nil]; 
} 

wiem, że jest coś takiego jak Key-Value Observing w iOS. Ale nie wiem, jak to wdrożyć, przeczytałem cały dokument, ale nie udało mi się dobrze zrozumieć.

Proszę mi pomóc zrozumieć, jak wdrożyć to samo bez użycia niestandardowego ustawiacza.

Odpowiedz

31

Spróbuj tego:

MyClass *var = [MyClass new]; 
[var addObserver:self forKeyPath:@"myName" options:NSKeyValueChangeOldKey context:nil]; 

i wdrożenie

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 

} 

ta metoda zostanie wywołana w każdej chwili, gdy nieruchomość mojanazwa zmienia

+0

Dzięki za odpowiedź :) –

+0

Zapraszamy) – alex

+0

Witam, zastanawiałem się, czy rozwiązanie jest lepsze KVO następnie drugiej realizacji rozwiązanie. Czy ktoś może to wyjaśnić? – NicTesla

15

W - (void)setMyName:(NSString *)name to zrobić zamiast

[self willChangeValueForKey:@"myName"]; 
_myName = name; 
[self didChangeValueForKey:@"myName"]; 

//this generates the KVO's 

A gdzie chcesz słuchać (The viewController), istnieje w viewDidLoad dodać ten wiersz:

[w addObserver: self forKeyPath: @ "MyName" opcje: kontekstowego NSKeyValueObservingOptionNew: nil];

// W ten sposób rejestrujesz viewController w celu odsłuchu KVO.

a także wdrożenia tej metody:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if ([[change objectForKey:NSKeyValueChangeNewKey] isEqual:[NSNull null]]) { 
     return; 
    } else { 
     //read the change dictionary, and have fun :) 
    } 
} 

// ta metoda jest wywoływana, gdy wartość nieruchomości ulegnie zmianie.

+0

Dzięki za odpowiedź :) –

+3

Ta odpowiedź jest znacznie lepsza niż zaakceptowana odpowiedź, która nie pokazuje jak wdrożyć KVO, tylko jak słuchać notatek KVO, które są już zaimplementowane – Chris

7

Aby to zrobić bez ustawiacza klienta, po prostu zsyntetyzuj zestaw właściwości. Spowoduje to utworzenie wszystkich wywołań pomocniczych do willChangeValueForKey/didChangeValueForKey.

@synthesize myName;

następnie ustawić wartości nieruchomości z dot-składnię:

self.myName = @ "Inigo Montoya"

Następnie obserwatorzy będą automatycznie otrzymywać powiadomienia KVO.

(Trzeba będzie usunąć obserwatora przed zwolnieniem obserwowanego obiektu).

+0

Dziękuję za odpowiedź :) –