Programování pro iOS - 38. Dokončení UITabBarControlleru - 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ů



Software

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):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Tipy a Triky  

 » Rubriky  » Začínáme s  

 » Rubriky  » Software  

Poslat článek

Nyní máte možnost poslat odkaz článku svým přátelům:

Váš e-mail:

(Není povinný)

E-mail adresáta:

Odkaz článku:

Vzkaz:

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

 

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

Uživatelské jméno:

Heslo: