Sledování změn objektů – ukázka - 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

 

Odkud pochází fotografka Anne Erhard?

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

Seriály

Více seriálů



Software

Sledování změn objektů – ukázka

21. února 2006, 00.00 | Než si řekneme více o tom, jak lze ovládat a řídit systém KVO, s jehož základy jsme se seznámili minule, pojďme se podívat na to, jak funguje, na konkrétním příkladu.

Než si řekneme více o tom, jak lze ovládat a řídit systém KVO, s jehož základy jsme se seznámili minule, pojďme se podívat na to, jak funguje, na konkrétním příkladu.

Tentokráte si samozřejmě nevystačíme s obyčejným "terminálovým" programem, protože předávání informací o změnách – stejně jako, mimochodem, notifikace – k rozumné funkci potřebuje event loop. Ačkoli bychom si jej mohli sestavit a spustit sami, ušetříme si spoustu práce, pokud použijeme standardní aplikaci.

Testovací projekt

Spustíme tedy Xcode, vytvoříme nový projekt typu "Cocoa Application", a sestavíme v něm velmi jednoduchoučké GUI, sestávající z jednoho textového pole pro editaci textu, který se zobrazí v titulku okna – celkem podobně obecnému příkladu, o němž jsme se bavili minule.

Pojďme nejprve takový projekt sestavit; přitom si také řekneme malinko více o tom, co jsme to vlastně dělali a co se ve skutečnosti dělo: v novém projektu ve skupině "Resources" najdeme "MainMenu.nib", ten poklepáním otevřeme v Interface Builderu, do jeho okna vhodíme textové pole – to již dávno umíme; do NIBu ale také hodíme ještě jeden NSObjectController a vhodně nastavíme jeho atributy:

Kontroléry se budeme podrobně zabývat až později; tento nejjednodušší však dělá jen málo jiného, než že nám automaticky a bez programování připraví model: modelem pro nás je NSMutableDictionary, jenž kontrolér automaticky připraví, a v němž (předpokládáme) bude jeden atribut se jménem "text". Samozřejmě – kdybychom si model připravili programově ([[NSMutableDictionary alloc] init]), fungovalo by vše stejně dobře; takhle je to ale méně práce, a navíc můžeme navazovat kombinace KVC/KVO přímo z Interface Builderu. Hned to uděláme pro textové pole:

Touto vazbou jsme v podstatě (s trochou zjednodušení, jež na této úrovni není podstatné) určili, že naše textové pole se bude chovat přesně podle požadavků, jež jsme si vypisovali minule:

  • při inicializaci textové pole zjistí momentální hodnotu atributu "text" v modelu (tedy v onom objektu NSMutableDictionary, který pro nás automaticky vytvoří kontrolér – pošle mu tedy zprávu valueForKeyPath:@"text"), a hned ji zobrazí (po spuštění aplikace bude samozřejmě hodnota prázdná);
  • hned také tomuto objektu NSMutableDictionary pošle zprávu addObserver:self forKeyPath:@"text" options:... context:..., aby se dozvědělo o případné změně modelu;
  • jestliže naopak uživatel obsah textového pole v okně změní, pole prostě a jednoduše pošle modelu novou hodnotu pomocí zprávy setValue:nováHodnota forKeyPath:@"text";
  • konečně pak po přijetí zprávy observeValueForKeyPath:ofObject:change:context: ihned zobrazí novou hodnotu;
  • před případným zrušením objekt odstraní svou registraci pomocí zprávy removeObserver:forKeyPath:.

Připojíme-li podobně samotné okno – resp. jeho "title" – na týž atribut:

a tím si pochopitelně vyžádáme, aby okno samo fungovalo podle téhož předpisu, můžeme si hned v Interface Builderu v režimu "Test Interface" vyzkoušet, že to funguje – zapíšeme-li do textového pole libovolnou hodnotu (a stiskneme Enter), text se ihned objeví v titulku okna.

Většina čtenářů jistě již ví proč; pro jistotu si to ale zopakujme:

  • po změně obsahu textové pole pošle modelu zprávu setValue:nováHodnota forKeyPath:@"text";
  • takže atribut modelu se změní, a tedy všichni, kdo se u něj zaregistrovali pomocí zprávy addObserver:self forKeyPath:@"text" ... nyní dostanou zprávu observeValueForKeyPath:@"text" ofObject:dictionary change:nováHodnota;
  • to platí tedy i pro okno; jeho implementace prostě tu novou hodnotu zobrazí v titulku... a je to!

Příště to zkusíme sami!

Je to jasné? Chcete-li, můžete si pohrát přidáním dalších objektů grafického uživatelského rozhraní – pokud všechny navážete na týž atribut modelu (tedy "text"), budou se díky výše popsanému mechanismu měnit automaticky a zcela korektně všechny najednou, a obsah atributu budeme moci měnit z kteréhokoli objektu GUI, který umožňuje editaci.

Není-li to snad ještě docela a úplně jasné, můžeme se těšit na příště, kdy si přesně týž mechanismus naprogramujeme "ručně", abychom přesně viděli, jak jednotlivé zprávy v systému KVC/KVO fungují.

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

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Software  

Diskuse k článku

 

Vložit nový příspěvek   Sbalit příspěvky

 

Zatím nebyl uložen žádný příspěvek, buďte první.

 

 

Vložit nový příspěvek

Jméno:

Pohlaví:

,

E-mail:

Předmět:

Příspěvek:

 

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: