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:
Software
Další vazby s jednoduchým kontrolérem
1. června 2006, 00.00 | Dnes si trochu "spravíme chuť" od minula – v minulém dílu jsme hodně povídali s takřka žádným výsledkem; dnes naopak využijeme systém vazeb k tomu, že bez dlouhých řečí grafické uživatelské rozhraní aplikace dost zásadně obohatíme.
V minulém dílu našeho seriálu jsme si připravili jednoduchý testovací projekt, obsahující modelový objekt s atributy "width" a "height" (automaticky udržovanými v poměru 4:3), s jednoduchým kontrolérem třídy NSObjectController, a se základním grafickým uživatelským rozhraním, obsahujícím jediné okno a formulář, umožňující vkládání hodnot pro oba atributy.
Jak jsme si řekli, konkrétní sada vazeb, kterou máme pro ten který objekt grafického uživatelského rozhraní k dispozici, je určena programátorem daného objektu a od ostatních se může lišit. Pojďme se dnes proto podívat na ukázku na několik typických možností, jež nám různé objekty GUI nabízejí. Dnes si tedy trochu "spravíme chuť" od minula – v minulém dílu jsme hodně povídali s takřka žádným výsledkem; dnes naopak využijeme systém vazeb k tomu, že bez dlouhých řečí grafické uživatelské rozhraní aplikace dost zásadně obohatíme.
Posuvníky: nic jednoduššího
Velmi přirozený požadavek je umožnit nastavování šířky i výšky pomocí posuvníků:
Nemá smysl čtenáře urážet ilustrací toho, jak je nastavit – prostě do okna vhodíme dva objekty NSSlider z palety "Cocoa–Controls", nastavíme požadovaným způsobem jejich atributy, jeden prostřednictvím vazby "value" připojíme opět na "selection.width" v kontroléru, druhý prostřednictvím téže vazby na "selection.height" – tedy naprosto přesně stejně, jako textová pole vedle nich.
To je celé: zbuildujeme, spustíme, vše funguje, všechny čtyři ovladače se automaticky vzájemně synchronizují. Už to by dalo při klasickém ručním programování kontrolérů nemálo práce – a to jsme teprve na začátku!
Indikace nuly
Zde je to spíš jen taková hříčka; v jiných kontextech se ale může velmi dobře hodit to, že bezmála každý objekt grafického uživatelského rozhraní se dokáže podmíněně skrývat – přičemž podmínku lze určit prostřednictvím vazeb. My toho využijeme pro indikaci nuly a nenuly, a zároveň si vysvětlíme položku "Value Transformer".
Vložíme do okna dvojici obyčejných textů (NSTextField z levého horního rohu palety "Cocoa–Text"); obsah prvého změníme na "Zero", druhého na "Nonzero". Vybereme prvý z nich, a otevřeme vazbu "hidden" ze skupiny "Availability". Navážeme atribut textu "hidden" – tedy "skryto" – na kteroukoli z hodnot atributů "width" či "height" modelu: vzhledem k jejich vzájemné vazbě přes daný poměr jsou oba zároveň nulové nebo oba zároveň nenulové. Funkce je zřejmá: je-li navázaná hodnota "ano" – tedy v kontextu jazyka C cokoli nenulového – objekt grafického uživatelského rozhraní se skryje; je-li hodnota "ne" – tedy nula – objekt (s nadpisem "Zero") se objeví...
Malinko složitější to je pro druhý objekt, nazvaný "Nonzero": ten by se totiž měl skrývat a objevovat podle podmínky přesně opačné. K tomu využijeme "Value Transformer": objekty grafického uživatelského rozhraní totiž při zjišťování hodnot, získaných prostřednictvím vazeb, vždy umožňují spustit obecnou programovou transformaci získané hodnoty. My se později naučíme takové převodníky psát a instalovat; zatím si však vystačíme s jedním ze standardně nabízených, který se jmenuje "NSNegateBoolean" a prostě převrátí podmínku na její opak:
Volba z předem připravených hodnot
Pro další ukázku vazby použijeme sadu "radio buttonů" – nalezneme je v paletě "Cocoa–Controls" poblíž jejího pravého horního rohu. Vhodíme je do okna, a tažením pravého okraje s přidržením přepínače Alt rozšíříme matici na 2x2 tlačítka. Jejich nadpisy změníme na něco rozumného – třeba "Twenty", "Forty", "Sixty" a "Eighty" – a v inspektoru atributů nastavíme tagy jednotlivých tlačítek na odpovídající hodnoty – tedy 20, 40, 60 a 80:
Pak označíme celou skupinu tlačítek, a pro tu jako celek určíme vazbu "selectedTag" – můžeme ji opět navázat třeba na atribut modelu "width". Tím zajistíme, že kdykoli uživatel klepne na některé z tlačítek, atribut "width" modelu se ihned nastaví na hodnotu, kterou jsme uložili pro toto tlačítko do jeho tagu – a naopak, získá-li náhodou model tutéž hodnotu nastavením z jiného ovladače, tlačítko se automaticky aktivuje:
Co třeba živá ukázka velikosti?
I taková věc se dá pomocí vazeb snadno udělat: z palety "Cocoa–Windows" přidáme do NIBu panel; v inspektoru atributů zakážeme všechny tři standardní ovladače vypnutím přepínačů "Close", "Minimize" a "Zoom (and resize)" v horní části inspektoru a také si vyžádáme jeho automatické zobrazení pomocí přepínače "Visible at launch time"; vhodné je také změnit jeho typ na "Utility window (panel only)", neboť tento typ má menší titulek (samozřejmě, ještě lepší by bylo okno vůbec bez titulku, ale takové nelze vytvořit přímo v Interface Builderu – na to bychom museli aspoň trochu programovat, a to si necháme na jindy; dnes si jen hrajeme s vazbami...).
Přepneme do inspektoru velikosti a ubezpečíme se, že minimální velikost okna je nastavena na nejmenší možnou kombinaci výšky a šířky – prostě je obě nastavíme na nulu, Interface Builder je automaticky změní na nejmenší možná čísla (pro "Utility window" by to mělo být 59 x 5).
Pak již jen navážeme podle předcházejícího obrázku "contentHeight" ze skupiny "Parameters" na atribut "height" v modelu, a podobně "contentWidth" na atribut "width" – a jsme hotovi!
Ovšem, z uživatelského hlediska by bylo patrně lepší nastavit "Value Transformer" z bodů na milimetry, takže by ukázkové okno nebylo tak malé; to si ale ukážeme až příště. Dnes se namísto toho na závěr ještě naučíme prostřednictvím vazeb generovat obecné texty, a umístíme jeden takový do titulku našeho právě vytvořeného ukázkového okna.
Texty s více parametry
Nezřídka by se nám hodilo v grafickém uživatelském rozhraní aplikace generovat komplikovanější texty, obsahující hodnoty různých atributů z objektů modelu. V nejobecnějším případě samozřejmě musíme takovou věc explicitně naprogramovat; pro jednodušší situace však bohatě postačí hezká a flexibilní podpora, již některé z objektů grafického uživatelského rozhraní nabízejí – jde o generování hodnoty na základě textového vzoru a libovolného množství atributů, jejichž hodnoty jsou do něj automaticky vloženy.
Jelikož mezi objekty grafického uživatelského rozhraní, jež tuto službu podporují, patří i titulek okna, "naprogramujeme" prostřednictvím vazeb to, aby titulek ukázkového okna obsahoval text "šířka x výška".
Označíme panel, a v inspektoru vazeb ve skupině "Title With Pattern" vybereme položku "displayPatternTitle1"; navážeme ji na atribut modelu "width", a do atributu "Display Pattern" zapíšeme textový řetězec "%{title1}@x%{title2}@". Jakmile vazbu dokončíme, automaticky se nám nabídne druhý atribut, "displayPatternTitle2"; ten nastavíme podobně, ale samozřejmě s atributem modelu "height":
Jakmile dokončíme jeho vazbu, automaticky se objeví třetí atribut "displayPatternTitle3"; pokud bychom jej vyplnili, objevil by se čtvrtý a tak dále, v libovolném počtu, jaký potřebujeme.
(Mimochodem, možná jste si povšimli, že stejně se nám objevily atributy "hidden2" po nastavení atributů "hidden" při určování indikace nuly – to proto, že objekty grafického uživatelského rozhraní obecně dokáží zkoumat libovolně mnoho atributů "hidden", a objekt se skryje, pokud platí kterýkoli z nich.)
Zpět k vazbám "displayPatternTitle": jejich atribut "Display Pattern" – sdílený všemi těmito vazbami, takže stačí nastavit jej v kterékoli z nich pro všechny najednou – je v podstatě formát, obdobný formátu funkce NSLog – může jím být libovolný textový řetězec, obsahující kromě běžných znaků také metařetězce "%{titleN}@". Každý tento metařetězec se pak nahradí hodnotou odpovídajícího atributu (který je uveden v patřičné vazbě "displayPatternTitleN").
Výsledek vypadá nějak takto:
Na těch pár minut "programování" v Interface Builderu to celkem ujde... a příště budeme pokračovat.
Pokud by se snad někomu nedařilo, hotový projekt obsahující všechny popsané služby nalezne na www.ocs.cz/apps/KVOTest.zip.
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