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:
Informace
Nastal čas na kakao - Interface Builder a uživatelské rozhraní
3. listopadu 2004, 00.00 | S aplikací Interface Builder jsme se zatím v našem seriálu nesetkali; než se pustíme do vlastního sestavování uživatelského rozhraní, řekneme si toho o ní aspoň malinko víc.
S aplikací Interface Builder jsme se zatím v našem seriálu nesetkali; než se pustíme do vlastního sestavování uživatelského rozhraní, řekneme si toho o ní aspoň malinko víc.
V zásadě by se dalo říci, že Interface Builder je editor objektových sítí; to ovšem málokomu hodně řekne. Podstatné však je následující:
- uživatelské rozhraní je v Cocoa tvořeno (celkem samozřejmě) sítí objektů: objekt třídy NSMenu representuje nabídku, a obsahuje vnořené instance třídy NSMenuItem pro jednotlivé položky (a další objekty NSMenu pro podnabídky); objekt NSWindow representuje okno, objekt NSTextView je jeho součástí a tvoří textový editor, objekt NSButton pak representuje tlačítko...
- jak už víme z článku "Vznik a zánik objektů", Cocoa podporuje tzv. persistentní objekty – objekty, jež jsou nějak uloženy (například v souboru), a tak mohou přežít ukončení aplikace;
- právě toho standardně aplikace Cocoa využívají pro své uživatelské rozhraní: namísto toho, aby se síť objektů, jež GUI representuje, vytvářela programově po spuštění aplikace (jakkoli i to je samozřejmě v případě potřeby možné), vytvoříme ji v editoru Interface Builder a uložíme do souboru. Aplikace pak po spuštění jen persistentní objekty ze souboru načte do paměti – a kompletní uživatelské rozhraní je hotové.
Stojí možná za zmínku, že právě tento geniální nápad stál hned u samého počátku objektového vývojového systému, jehož dnešní podobu známe pod jménem Cocoa: Interface Builder byl vůbec první programátorskou aplikací, jež se objevila v prvých versích operačního systému NeXTStep v sedmdesátých letech...
Je také důležité si uvědomit zásadní rozdíl mezi resource editory, jako byl třeba ResEdit ve starých versích operačního systému Mac OS (do verse 9), nebo jaké jsou k dispozici v řadě vývojových prostředí pro jiné systémy, a Interface Builderem: resource editory zpracovávají datový popis, na jehož základě se za běhu uživatelské rozhraní generuje. Interface Builder naproti tomu je editorem skutečných objektů, z nichž se uživatelské rozhraní fakticky skládá – to mu, oproti resource editorům, dává nesrovnatelně větší flexibilitu a možnosti.
To ostatně uvidíme i v našem příkladu: ačkoli jsme až dosud implementovali jen zcela holý datový model bez jakékoli explicitní podpory pro GUI či kontroler, jež by vazbu mezi GUI a modelem zajišťoval, pro dokončení celé aplikace už nebudeme muset napsat ani jediný řádek v programovacím jazyce! Vše potřebné zajistíme vytvořením vhodné sestavy objektů v Interface Builderu, určením jejich vzájemných vazeb a nastavením jejich atributů.
Základní skladba objektů GUI
Nemusíme se sestavou grafického uživatelského rozhraní začínat od nuly: když jsme v XCode vytvořili základní kostru aplikace, standardní soubor "MainMenu.nib", obsahující archivované objekty pro hlavní nabídku a jedno prázdné okno, byl vytvořen automaticky a uložen do skupiny "Resources". Stačí tedy otevřeme-li jej – stačí na soubor v XCode poklepat, Interface Builder se spustí automaticky – a vše potřebné doplníme.
Základní služba, již Interface Builder nabízí, je možnost vybírání standardních objektů uživatelského rozhraní z tzv. palet a jejich vkládání do sítě objektů dané aplikace. Na obrázku vidíme hlavní okno, jež graficky representuje obsah objektové sítě ("MainMenu.nib"), a také okno obsahující palety (to můžeme kdykoli zavřít a opět zobrazit příkazem Tools / Palettes / Show Palettes):
V hlavním okně vidíme dvojici pomocných zástupců File's Owner a First Responder – těm se zatím nebudeme věnovat, vrátíme se k nim v pozdějších příkladech, až si budeme ukazovat všechny možnosti, jež Interface Builder nabízí. Vedle nich zde jsou dva "kořenové" objekty ("kořenové" proto, že mohou obsahovat řadu dalších, vnořených objektů, jež hlavní okno v tomto režimu nezobrazuje): MainMenu – hlavní nabídka aplikace, a Window – prázdné, automaticky vygenerované okno. Kterýkoli z těchto objektů můžeme poklepáním otevřít a dále s ním pracovat.
Je vhodné hned zdůraznit, že jména kořenových objektů ("MainMenu", "Window") jsou – podobně jako jména skupin v XCode – v podstatě bezvýznamná, a slouží jen pro naši lepší orientaci. "Ve skutečnosti" objekty tato jména nemají; to jen Interface Builder si kořenové objekty pod těmito jmény pamatuje, abychom při práci s ním snadno rozlišili třeba více různých oken. Jméno můžeme kdykoli standardním způsobem změnit (poklepeme na něj, zapíšeme nové).
Začněme tím, že do okna vložíme všechny potřebné objekty uživatelského rozhraní: nejprve na objekt "Window" poklepeme – tím se odpovídající okno otevře (nebo, bylo-li již otevřeno, přemístí na popředí) –, a pak do něj postupně, shora dolů, "naházíme" myší z palet vhodné objekty.
Začneme textovým polem pro vložení nového URL. Textové pole je ve třetí, textové paletě hned vlevo nahoře. Prostě jej z palety myší odvezeme do okna; povšimněte si, že Interface Builder pomocí přerušovaných čar naznačuje, kam objekt umístit aby vzdálenosti mezi okraji okna a objektem (nebo různými objekty) co nejlépe odpovídaly standardům uživatelského rozhraní Cocoa:
Po umístění je objekt označen, a můžeme měnit jeho velikost (či místo). Roztáhneme textové pole tak, aby nám u pravého okraje okna zůstalo místo jen na tlačítko "Add"; to tam vhodíme z druhé palety ovladačů, kde je také vlevo nahoře (paletu ovladačů vidíme na prvém obrázku v tomto článku). Text "Button" na tlačítku změníme po vhození na "Add" opět zcela standardně – prostě poklepeme na tlačítko, změníme text. Obdobným způsobem postupně
- umístíme pod textové pole rozevírací nabídku (NSPopUpButton) z téže palety jako tlačítko (je pod ním s textem "Item1", opět viz prvý obrázek) a roztáhneme jej na stejnou šířku, jakou má textové pole;
- vedle něj dáme další tlačítko a nadepíšeme jej "Delete";
- pod rozevírací nabídku dáme tabulku (NSTableView) z datové, páté palety (její ikonka obsahuje tabulku, a tabulka je v paletě zase hned vlevo nahoře). Tabulku zvětšíme tak, aby zabírala přibližně polovinu ze zbývajícího místa v okně;
- pod tabulku umístíme textový objekt – to je ten, jehož ikonka v textové (druhé) paletě, již vidíme na minulém obrázku, obsahuje "Lorem ipsum dolor..."; ponecháme jej prozatím hodně "nízké";
- pod něj – už k samému dolnímu okraji okna – umístíme z téže paletky "System Font Text" a jeho obsah změníme na "URL:";
- a vedle do pravého dolního rohu okna doplníme další textové pole pro URL;
- a nyní zvětšíme výšku textového objektu tak, aby vyplnil zbytek okna.
Tím máme všechny základní objekty grafického uživatelského rozhraní připraveny; okno by nyní mělo vypadat přibližně nějak takto:
Zbývá ještě jeden trik: zajistit, aby tabulka a textový objekt mezi sebou měly "přepážku", jež umožní beze změny velikosti okna měnit jejich poměrné velikosti. To se v Interface Builderu dělá tak, že oba objekty označíme (zcela standardně, třeba tažením nebo ⇧-klepnutím myši), a pak z nabídky vybereme službu "Layout / Make subviews of / Split View". Objekty se hned spojí a na předělu mezi nimi se objeví "důlek":
Testování uživatelského rozhraní
Interface Builder díky tomu, že obsahuje skutečné, plně funkční objekty (a ne jen nějaké vzory jako resource editory), umožňuje sestavené uživatelské rozhraní ihned vyzkoušet: samozřejmě, dosud nemáme hotový kontrolér ani vazbu na model, takže objekty nebudou korektně spolupracovat a nebudou také obsahovat patřičná data; můžeme si však snadno vyzkoušet, jak dobře (nebo špatně) se s nimi bude pracovat.
Stačí, zvolíme-li příkaz "Test Interface" z nabídky "File". Interface Builder se přepne do režimu, v němž (v mezích možností) simuluje naši aplikaci: můžeme psát do textových polí, můžeme vybírat z rozevírací nabídky, můžeme měnit velikost okna... ouha: zkusíme-li to, vidíme, že objekty uvnitř okna nemění svou velikost odpovídajícím způsobem, ale namísto toho zůstávají "nalepeny" do levého dolního rohu:
To proto, že jsme patřičně nenastavili jejich atributy. Příště si ukážeme, jak na to. Kromě správných změn velikostí také určíme, které textové objekty lze měnit a které ne, nadpis celého okna a podobně.
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