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
Programování pro iOS - 38. Dokončení UITabBarControlleru
20. dubna 2011, 00.00 | Dnešním dílem našeho seriálu o programování v iOSu dokončíme to, co si chceme říci o UITabBarControlleru. Vytvoříme také novou ukázkovou aplikaci, v níž si budeme některé z postupů ilustrovat.
Zbývá nám jen několik málo drobností, jež je ještě vhodné říci o třídě UITabBarController. Pak máme v plánu se podívat blíž na další standardní řídicí objekty a jejich využití, od tříd UIPopoverController nebo UISplitViewController, jež pomáhají využít velkou obrazovku iPadu, až po specializované řídicí objekty pro některé konkrétní úlohy, jako třeba UIImagePickerController nebo velmi zajímavý (ale bohužel co do úrovně služeb krajně omezený) UIDocumentInteractionController.
Vzhledem k tomu, že se podle diskuse u minulého článku zdá, že pro některé ze čtenářů je problematické pochopit (ba i jen rozpoznat) praktický příklad, není-li ukotven v rámci kompletní aplikace a opatřen ilustračními obrázky, přidáme zase na nějakou chvíli do výkladu i ty základní věci, jež jsme si už několikrát vyložili – a zkušené programátory požádáme, aby to, co je nezajímá, přeskakovali.
Poznámka: zatím budeme ještě ilustrovat práci příklady ze stabilního a rozšířeného Xcode 3. Nové "čtyřce" věnujeme v budoucnosti samostatný blok, v němž si podrobně popíšeme její novinky, výhody (jsou-li jaké) a nevýhody (jichž je spousta); to ale nyní ještě ponecháme stranou.
Nová aplikace
Vytvoření nové aplikace není nic těžkého: v Xcode použijeme standardní příkaz "File / New Project"; z projektových vzorů pak zvolíme "iOS Application / Tab Bar Application" pro iPad (to jen proto, že brzy se budeme zabývat službami specifickými pro iPad, jako je třeba split view; pro dnešek by to bylo zcela lhostejné) – takto:
Pak už jen zvolíme složku, do níž má být projekt uložen a jeho jméno, a necháme Xcode, aby nám projekt na základě standardních vzorů sestavilo.
Detailní přehled toho, co je v Xcode co a jaký to má smysl, skutečně opakovat nebudeme – věnovali jsme mu již několik dílů, z nichž zvláště díl 2 – začínáme programovat obsahoval detailní popis všech standardních prvků projektu i informace o tom, čemu který slouží.
Podíváme se proto rovnou do souboru "MainWindow.xib" – poklepáním jej otevřeme v aplikaci Interface Builder. Uvidíme, že nám zde projektový vzor již připravil jak vlastní instanci třídy UITabBarController – není již tedy zapotřebí, abychom ji sestavovali programově –, tak i dva obecné řídicí objekty rámců, uložené do jeho atributu viewControllers:
Více záložek...
Pokud bychom aplikaci sestavili a spustili přesně tak, jak nám ji systém projektových vzorů v Xcode připravil, fungovala by bez problémů; obsahovala by ale pouhé dvě záložky. Doplníme proto nejprve několik dalších.Programově to už umíme, ale jak na to v Interface Builderu? Snadno: použijeme tlačítko [+] v inspektoru (na minulém obrázku je vidíme při dolním okraji zhruba uprostřed) a přidáme několik dalších řícidích objektů. Nastavíme jim vhodné titulky:
a také pro každý z nich v inspektoru identity určíme, že jeho třídou má být SecondViewController. Mohli bychom zároveň v inspektoru atributů pro každý určit, že jeho NIB se má jmenovat "SecondView"; bylo by to ale zbytečně moc práce. Místo toho je snazší (a i konsistentnější) využít toho, že neurčíme-li jméno NIBu, každý řídicí objekt rámce se standardně pokusí načíst NIB téhož jména, jako je jméno jeho třídy – zrušíme tedy i jméno NIBu u druhého z řídicích objektů (tedy toho, který nám ještě připravil projektový vzor), a pak v Xcode přejmenujeme soubor "SecondView.xib" na "SecondViewController.xib".
Pro konsistenci bychom mohli udělat totéž s "FirstView", samozřejmě – pokud by nám to stálo za to.
... a jejich jména
Pokud bychom aplikaci sestavili a spustili nyní, již by vše fungovalo se spoustou záložek; ty, jež jsou řízeny objektem třídy SecondViewController by však byly obtížně navzájem rozlišitelné. Postaráme se proto ještě rychle o zobrazení jejich titulků: v editoru si otevřeme soubor "SecondViewController.h" a přidáme nový "outlet" – tedy instanční proměnnou pro přístup k objektu GUI:
Do implementace pak už jen přidáme – to se už snad obejde bez obrázku
@implementation SecondViewController
...
-(void)viewDidLoad {
[super viewDidLoad];
label.text=self.title;
}
...
a v Interface Builderu propojíme v souboru "SecondViewController.xib" nový outlet s textovým polem, v němž se pak zobrazí titulek:
Konečně zpět k UITabBarControlleru!
Nyní už jsme s projektem konečně tak daleko, že se můžeme vrátit k API třídy UITabBarController: ukážeme si několik jejích zbývajících často používaných služeb.Předně – máme-li záložky takto nastaveny v NIBu, zřejmě půjde spíše o případ, kdy nechceme dovolit uživateli, aby jejich pořadí měnil (ačkoli by to samozřejmě také šlo – museli bychom po spuštění jen obsah pole viewControllers změnit).
Nu dobrá, ale v tom případě asi budeme chtít, aby vůbec ve stránce "More..." nebylo tlačítko "Edit" – jak toho dosáhnout?
K tomu slouží další atribut třídy UITabBarController, nazvaný customizableViewControllers: jeho obsahem je pole řídicích objektů, stejně, jako tomu je u atributu viewControllers – na rozdíl od něj ale obsahuje právě ty, jejichž pořadí lze měnit. Pokud tedy kupříkladu ve zdrojovém souboru našeho aplikačního delegáta uděláme toto:
-(BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)lo {
tabBarController.customizableViewControllers=nil;
[self.window addSubview:tabBarController.view];
[self.window makeKeyAndVisible];
return YES;
}
docílíme přesně toho, co jsme chtěli – tlačítko "Edit" nebude k dispozici a pořadí ikon v liště nebude možné měnit.
Samozřejmě, můžeme do tohoto atributu uložit i nějakou neprázdnou podmnožinu řídicích objektů z viewControllers; často tomu tak bývá v případech, kdy např. první z ikon má zůstávat vždy na svém místě, a měnit se mohou jen ostatní. V našem případě bychom toho docílili třeba tak, že bychom si vytvořili kopii pole viewControllers a vyřadili z ní první objekt:
tabBarController.customizableViewControllers=
[tabBarController.viewControllers
subarrayWithRange:NSMakeRange(1,
tabBarController.viewControllers.count-1)];
Poslední, co si dnes ukážeme, je možnost programově zvolit některý z řidicích objektů, jiný, než ten prvý, co se aktivuje standardně. K tomu slouží (kromě jiného) atribut selectedViewController, který můžeme použít třeba takto:
tabBarController.selectedViewController=
tabBarController.viewControllers.lastObject;
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