Nastal čas na kakao - Druhý kontrolér a dokončení aplikace - 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

 

Jaký fotograf/ka získal/a cenu za nejpopulárnější příspěvek v Nikon Photo Contest?

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

Seriály

Více seriálů



Začínáme s

Nastal čas na kakao - Druhý kontrolér a dokončení aplikace

2. prosince 2004, 00.00 | Minule jsme se v hrubých rysech naučili v Interface Builderu používat kontrolery a vazby ("bindings") mezi objekty; jejich pomocí (a s využitím starého dobrého mechanismu akce/cíl pro dvojici tlačítek) jsme implementovali kompletní služby aplikace pro prvé textové pole, pro obě tlačítka i pro rozevírací nabídku.

Minule jsme se v hrubých rysech naučili v Interface Builderu používat kontrolery a vazby ("bindings") mezi objekty; jejich pomocí (a s využitím starého dobrého mechanismu akce/cíl pro dvojici tlačítek) jsme implementovali kompletní služby aplikace pro prvé textové pole, pro obě tlačítka i pro rozevírací nabídku. Nyní zbývá se jen postarat o tabulku, o textový objekt a o textové pole s URL u dolního okraje okna.

Než se ovšem pustíme do práce, měli bychom si odpovědět na malý kvíz z konce minulého dílu: proč nám na vyzkoušení toto, co jsme udělali minule, nestačila služba "Test Interface" Interface Builderu, pročpak – chtěli-li jsme rozevírací nabídku a tlačítka otestovat – jsme museli generovat aplikaci v XCode? Většině čtenářů našeho seriálu je to jistě dávno jasné; jen pro jistotu tedy: ovšemže proto, že Interface Builder nemá k dispozici náš model! Kontrolér "RSS Controller" jsme nastavili tak, aby pracoval s třídou jménem "RSS"; to je v pořádku, ale v režimu "Test Interface" v Interface Builderu žádná taková třída samozřejmě není – abychom ji měli k dispozici, musíme naši aplikaci zbuildovat.

Druhý kontrolér

Proč druhý kontrolér? Inu, pozornějším čtenářům už je asi jasné i to: jeden objekt NSArrayController spravuje jedno pole objektů; ten, který již máme, se tedy stará o pole objektů třídy RSS. Nyní ovšem, chceme-li vyplnit tabulku, budeme pracovat s dalším polem – s polem zpráv, které nám vybraný objekt třídy RSS vrátí po použití accesoru news.

Umístíme tedy do projektu v Interface Builderu druhý NSArrayController stejně jako minule (tedy vhozením z palety do hlavního okna Interface Builderu), přejmenujeme jej na něco rozumného – třeba "News Controller" – a nastavíme jej vhodným způsobem. K tomu ovšem opět poslouží inspektor: označíme nový kontrolér, a nejprve inspektor přepneme do režimu atributů; to ukazuje obrázek dole vlevo.

Povšimněme si trochu odlišného nastavení atributů kontroléru, než tomu bylo minule: samozřejmě neobsahuje objekty třídy RSS, ale objekty třídy NSDictionary (stejně dobře bychom mohli použít skutečnou třídu NSMutableDictionary; jelikož však obsah objektů nechceme měnit, je trochu čistší se na ně dívat jako na NSDictionary; korektní to ovšem je proto, že NSMutableDictionary je podtřídou NSDictionary). Tentokrát neoznačíme přepínač "Automatically prepared content", protože tento kontrolér nemá své pole sám vytvářet – má přece jen spravovat pole, jež dostane "zvenku" (speciálně tedy od vybraného objektu třídy RSS). Podobně vypneme "Editable", neboť toto pole měnit nijak nebudeme. "Keys" ovšem musíme opět zadat "ručně", a tentokrát by to jinak nešlo v žádném případě, neboť jde o tagy ze streamu RSS – a zde ovšem Interface Builder nemůže tušit, jaké tyto tagy budou:

Pak přepneme inspektor do režimu "Bindings" a postaráme se o to, aby kontrolér správně získal pole objektů, nad nímž má pracovat: jak jsme si řekli před chvilkou, je to pole, jež dostane od vybraného objektu třídy RSS. Z toho celkem zřejmě plyne, že "contentArray" našeho kontroléru navážeme na objekt "RSS Controller", key "selection" (tedy vybraný objekt), "Model Key Path" news.

Nyní navážeme na kontrolér tabulku: to značí trojici vazeb: "arrangedObjects" z kontroléru na tabulku jako celek, vazbu označeného řádku tabulky na vybraný objekt kontroléru, a vazbu sloupce tabulky na konkrétní atribut objektu. Tato poslední vazba je nutná proto, že tabulka samozřejmě obecně může mít libovolně mnoho sloupců – a každý z nich bude obvykle zobrazovat jiný atribut.

Vazby tabulky už jsou celkem samozřejmé: označíme tabulku, a v inspektoru "Bindings" nastavíme její "content" a "selectionIndexes":

Pak už jen označíme sloupec tabulky – je-li tabulka označená jako celek, objeví se její záhlaví, ačkoli normálně je jeho zobrazování vypnuto, a my prostě klepneme myší na toto záhlaví – a v inspektoru v režimu "Bindings" nastavíme odpovídající vazbu:

(Pozor na přepínač "Conditionally Sets Editable": pokud bychom jej nechali zapnutý, umožnil by editaci řádků tabulky – to samozřejmě nechceme.)

Zbývá už jen zajistit správné vazby textového objektu a textového pole u dolního okraje obrazovky; to již jistě každý snadno zvládne sám – u obou je třeba navázat atribut "value" na description a link právě vybraného objektu v kontroléru. Jen pro kontrolu tedy ukážeme na dvojici obrázků oba "bindingy":

A to je už opravdu vše: pokud jste někde na něco nezapomněli, nyní aplikace kompletně funguje (samozřejmě po přegenerování v XCode): zadané URL v textovém poli se přidá do rozevírací nabídky, pro zvolený stream RSS z rozevírací nabídky se zobrazí v tabulce titulky jeho novinek, a pro novinku, vybranou v tabulce, se v textovém objektu zobrazí její obsah a v textovém poli u dolního okraje okna její URL.

Funguje to? Výborně!

Zkusme ale třeba postupně smazat všechny streamy RSS tlačítkem "Delete": v nabídce se objeví jakési nesmyslné číslo. Také by jistě bylo pěkné, kdyby se chyby (zadejte např. prázdné URL) zobrazovaly nějak zvýrazněně oproti běžným textům, nebo kdybychom mohli jen zadat do textového pole nové URL, stisknout Enter, a nemuseli ještě myší hledat tlačítko "Add"... zkrátka, jakkoli aplikace už funguje komplet, zaslouží si ještě trošku "učesat". Na to se už ale podíváme zase příště.

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

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Začínáme s  

 

 

 

 

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

Uživatelské jméno:

Heslo: