Sledování změn objektů – zdrojový kód - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se narodil známý fotograf František Drtikol?

V dnešní soutěži hrajeme o:

Seriály

Více seriálů



Software

Sledování změn objektů – zdrojový kód

2. března 2006, 00.00 | Dnes přesně týž mechanismus, který jsme minule "namyšovali", naprogramujeme "ručně", abychom přesně viděli, jak jednotlivé zprávy v systému KVC/KVO fungují.

Nyní do projektu přidáme vlastní třídu, třeba Test; vytvoříme její instanci, zajistíme si z ní přístup k modelu, a uděláme přesně totéž, co dělá textové pole a/nebo okno "ručně". Prvních několik kroků lze stále ještě udělat přímo v Interface Builderu: pro vytvoření nové třídy slouží režim "Classes", v inspektoru pak můžeme přidávat outlety (stačí nám jeden, jehož prostřednictvím získáme přístup k NSObjectControlleru, z nějž pak získáme model), a instanci vytvoříme přímo v NIBu příkazem "Instantiate":

Po vytvoření instance ovšem nezapomeneme příkazem "Create Files for Test" z téže nabídky vygenerovat kostry zdrojových souborů a automaticky je vložit do projektu, a také nezapomeneme fakticky navázat outlet na kontrolér:

Zdrojový kód

Implementaci třídy Test sestavíme následovně:

  • při inicializaci (k tomu slouží standardní metoda awakeFromNib – framework automaticky pošle libovolnému objektu odpovídající zprávu po zavedení NIBu do paměti) náš objekt najde model (prostřednictvím outletu controller), a hned se u něj zaregistruje pomocí zprávy addObserver:self forKeyPath:@"text" options:... context:...;
  • po přijetí zprávy observeValueForKeyPath:ofObject:change:context: opíše novou hodnotu do logu, a pokud nová hodnota náhodou začínala znakem 'a', počká pět sekund, a pak pomocí zprávy setValue:@"Bylo to 'a'" forKeyPath:@"text" obsah modelu opět změní;
  • před případným zrušením objekt odstraní svou registraci pomocí zprávy removeObserver:forKeyPath:.

Zdrojový kód není nikterak složitý; jediné, co "jsme dosud nebrali", je argument options: – v něm standardní identifikátor NSKeyValueObservingOptionNew řekneme, že chceme, aby nám model v případě změny poslal rovnou novou, změněnou hodnotu (alternativně bychom si mohli vyžádat hodnotu původní pomocí identifikátoru NSKeyValueObservingOptionOld, nebo obě, pokud identifikátory spojíme operátorem |).

Podobně pak zpráva observeValueForKeyPath:ofObject:change:context: předá novou hodnotu v argumentu change:, jenž je slovníkem, a hodnota je v něm uložena s klíčem NSKeyValueChangeNewKey.

Poslední finta spočívá v tom, že s navázáním počkáme chvíli po provedení awakeFromNib; to proto, že sám NSObjectController vytváří model ve své vlastní metodě awakeFromNib – takže kdybychom obsah metody delayedInit zkusili provést hned v awakeFromNib, mohlo by se nám stát, že model dosud nebude existovat.

A to je vše – zdrojový kód vypadá nějak takto:

@implementation Test
-(void)delayedInit {
    [[controller content] addObserver:self
                           forKeyPath:@"text"
                              options:NSKeyValueObservingOptionNew
                              context:NULL];
}
-(void)awakeFromNib {
    [self performSelector:@selector(delayedInit)
               withObject:nil afterDelay:0];
}
-(void)delayedChange {
    [[controller content] setValue:@"Bylo to 'a'" forKey:@"text"];
}
-(void)observeValueForKeyPath:(NSString*)path
                     ofObject:o
                       change:(NSDictionary*)d
                      context:(void*)ctxt {
    NSString *val=[d objectForKey:NSKeyValueChangeNewKey];
    NSLog(@"Hodnota: \"%@\"",val);
    if ([val hasPrefix:@"a"])
        [self performSelector:@selector(delayedChange)
                   withObject:nil afterDelay:5];
}
@end

Hned si také můžeme vyzkoušet, že vše funguje jak má – kdykoli do textového pole vložíme novou hodnotu, naše instance třídy Test ji hned opíše do logu; pokud náhodou text začíná znakem 'a', po pěti sekundách jej nahradí textem vlastním:

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Software  

Poslat článek

Nyní máte možnost poslat odkaz článku svým přátelům:

Váš e-mail:

(Není povinný)

E-mail adresáta:

Odkaz článku:

Vzkaz:

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: