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:
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):
- Nastal čas na kakao...
- Tak nejdřív kakao ochutnáme...
- Programovací jazyk C: velmi, velmi stručně
- Objective C: to si vysvětlíme podrobněji
- Co jsme si o Objective C ještě neřekli...
- Nastal čas na kakao - Vznik a zánik objektů
- Nastal čas na kakao - Kopírování objektů
- Nastal čas na kakao - Skryté podtřídy
- Nastal čas na kakao - Základní služby objektů
- Nastal čas na kakao - Jak správně psát v Objective C
- Nastal čas na kakao - Jak správně importovat
- Nastal čas na kakao - Podtřídy, delegáti, vkládání, jak se to rýmuje?
- Nastal čas na kakao - Využití kategorií namísto dědičnosti
- Nastal čas na kakao - Vkládání objektů a přesměrování zpráv
- Nastal čas na kakao - Inicializace a rušení objektů
- Nastal čas na kakao - Metody initWith... a designovaný inicializátor
- Nastal čas na kakao - Inicializace: tipy a triky
- Nastal čas na kakao - Accesory: přístup k proměnným instancí
- Nastal čas na kakao - Šedá je teorie, zelený je strom života...
- Nastal čas na kakao - Více o XCode: inspektory
- Nastal čas na kakao - Aplikace RSS2: datový model
- Nastal čas na kakao - Aplikace RSS: implementace datového modelu
- Nastal čas na kakao - Aplikace RSS: parsování XML
- Nastal čas na kakao - Interface Builder a uživatelské rozhraní
- Nastal čas na kakao - Interface Builder: atributy objektů
- Nastal čas na kakao - Interface Builder: atributy objektů
- Nastal čas na kakao - Druhý kontrolér a dokončení aplikace
- Nastal čas na kakao - Drobná vylepšení a zdokonalení...
- Nastal čas na kakao - Ladění
- Nastal čas na kakao - Třídy Foundation Kitu
- Nastal čas na kakao - Třídy Foundation Kitu (2)
- Nastal čas na kakao - Textové řetězce: NS(Mutable)String
- Nastal čas na kakao - Čísla, binární data a další...
- Nastal čas na kakao - Archivace objektů
- Nastal čas na kakao - Trocha magie, aneb distribuované objekty
- Nastal čas na kakao - Málem bychom zapomněli: NSAutoreleasePool
- Nastal čas na kakao - Zpracování výjimek: NSException
- Nastal čas na kakao - NSInvocation a černá magie
- Nastal čas na kakao - Kakao v Tygrovi
- Nastal čas na kakao - Notifikace: nepřímé předávání zpráv
- Nastal čas na kakao - NSUserDefaults
- Nastal čas na kakao - Co nového ve Foundation Kitu
- Nastal čas na kakao – s Intelem, s Intelem, jedeme do...
- Co nového v Xcode
- Začínáme s AppKitem
- Jak MVC v Kakau vypadá doopravdy?
- Jak MVC v Kakau vypadá doopravdy: dokončení
- Přehled tříd AppKitu
- Nastal čas na kakao - Přehled tříd AppKitu 2
- Přehled tříd AppKitu 3: zbývající třídy GUI
- Přehled tříd AppKitu 4: textový systém
- Nastal čas na kakao - Přehled tříd AppKitu 5: hlavně grafika
- Přehled tříd AppKitu 6: dokumentový systém
- Přehled tříd AppKitu 7: dokončení
- Pojmenované vlastnosti objektů
- Pojmenované vlastnosti objektů: implementace
- Pojmenované vlastnosti objektů: relace 1:N
- Pojmenované vlastnosti objektů: řazení jmen a agregační funkce
- Sledování změn objektů
- Sledování změn objektů – ukázka
- Sledování změn objektů – zdrojový kód
- Sledování změn objektů: kód modelu
- Sledování změn objektů: přímý přístup
- Kontroléry a vazby
- Vázání vazeb
- Další vazby s jednoduchým kontrolérem
- Implementace a použití převodu hodnot
- Validace hodnot
- Validace a chyby, a jedna hezká vazba...
- Práce s polem objektů
- Základní vazby NSArrayControlleru
- Převodníky, přepínače, placeholdery
- Mírná vylepšení v mezích zákona
- Objective C 2.0 - novinky z Leoparda
- NSTreeController
- Programování v Cocoa - Pár tipů a triků
- Programování v Cocoa - Základy kreslení
- Kterak nakreslit modrý obdélník...
- Další služby pro kreslení
- Obrázky a písmenka...
- Události a myš
- Lepší práce s myší
- Události klávesnice
- Input Management
- Příkazy a schránka
- Další události
- Táhni a padni
- Byli jsme na tahu; nyní padneme.
- Zvolme si, jak vhodit
- Drobnosti a chybičky
- Speciální případy tahání či házení
- Kterak táhnout něco, co neexistuje?
- Jak na sítě...
- NSURLConnection
- Safari za minutu
- Služby WebKitu
- Kakao v Leopardu
- Druhé Objective C
- Druhé Objective C: různé drobnosti
- Druhé Objective C: kategorie a protokoly
- Druhé Objective C: nový příkaz cyklu
- Druhé Objective C: atributy a accesory
- Druhé Objective C: atributy a accesory
- 64 je dvakrát 32
- Ubicumque dulce est, ibi et acidum invenies...
- Irbis: že prý žádné novinky?
- Blok sem, blok tam, nám už je to všechno jasné...
- Bloky jsou i v AppKitu
- Irbis a Foundation Kit
- Kde jsou má data?
- Kde jsou má data? V NSCache!
- Soubor, jméno, URL, jak se to rýmuje...
- Další podpora NSURL
- Zabíjení!
- A máme tady i...OS!
- Systémové prvky GUI
- Programování pro iOS 1. díl - Rozdíly mezi "i" a "Mac"
- Programování pro iOS - 2. Začínáme programovat
- Programování pro iOS - 3. základní ovladače a propojení GUI s kódem
- Programování pro iOS - 4. Varovná hlášení
- Programování pro iOS - 5. Rámce a jejich řídicí objekty
- Programování pro iOS - 6. Ukládání dat
- Programování pro iOS - 7. Správa paměti a starý restík
- Programování pro iOS - 8. Dokončení aplikace
- Programování pro iOS - 9. Jak dostat aplikaci do iPhone
- Programování pro iOS - 10. Instalace aplikace do cizího iPhone
- Programování pro iOS - 11. Jak dostat aplikaci do libovolného iPhone
- Programování pro iOS - 12. Touching!
- Programování pro iOS - 13. Kreslíme na iPhone
- Programování pro iOS - 14. Udělejme gesto
- Programování pro iOS - 15. Další gesta
- Programování pro iOS - 16. Více prstů, více zábavy
- Programování pro iOS - 17. Podpora standardních gest
- Programování pro iOS - 18. Recognizery v iOS
- Programování pro iOS - 19. Další standardní recognizery
- Programování pro iOS - 20. Co nového v iOSu
- Programování pro iOS - 21. "Multitasking"
- Programování pro iOS - 22. Nulla est honesta avaritia nisi temporis
- Programování pro iOS - 23. Jak se aktivovat, jsme-li v pozadí
- Programování pro iOS - 24. Zbývající drobnosti
- Programování pro iOS - 25. Řídicí objekty rámců
- Programování pro iOS - 26. Jak se dělá UIViewController
- Programování pro iOS - 27. Kde vzít rámce
- Programování pro iOS - 28. Základní služby
- Programování pro iOS - 29. Práce s rámci
- Programování pro iOS - 30. Rotace zařízení
- Programování pro iOS - 31. Správa paměti v rámcích
- Programování pro iOS - 32. Řídicí objekt pro tabulky
- Programování pro iOS - 33. Řídicí objekt pro strom
- Programování pro iOS - 33. Více o UINavigationControlleru
- Programování pro iOS - 35. Ještě jednou UINavigationController
- Programování pro iOS - 36. Po navigátoru taby
- Programování pro iOS - 37. Více o UITabBarControlleru
- Programování pro iOS - 38. Dokončení UITabBarControlleru
- Programování pro iOS - 39. UIPopoverController
- Programování pro iOS - 40. Další triky UIPopoverControlleru
- Programování pro iOS - 41. Zbývající služby UIPopoverControlleru
- Programování pro iOS - 42. UISplitViewController
- Programujeme v
iTunesXcode 4 - Programování pro iOS - 44. Předvolby Xcode 4
- Programování pro iOS - 45. Práce v Xcode 4
- Xcode 4: projekt a cíle
- Xcode 4: práce s cíli
- Xcode 4: Build Settings
- Xcode 4: Build Phases
- Xcode4: Build Phases podruhé
- Xcode 4: Co jsou to Build Rules?
- Xcode4: taje editoru
- Xcode4: automatické doplňování v editoru
- XIBy chyby
- Více o XIBech
- Editor XIBů
- Inspektory pro XIBy
- Vazby mezi objekty v XIBech
- Vazby mezi objekty v kódu
- Paletky Xcode pro XIBy
- Xcode 4: levý sloupec
- Xcode 4: okno Organizer
- Xcode 4: okno Organizer, část druhá
- Xcode 4: co je to Workspace?
- Xcode 4: základy schémat
- Xcode 4: akční schémata