Vazby mezi objekty v XIBech - 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

 

Odkud pochází fotografka Anne Erhard?

V dnešní soutěži hrajeme o:

Seriály

Více seriálů



Software

Vazby mezi objekty v XIBech

14. září 2011, 00.00 | Minule jsme si ukázali podrobněji všechny inspektory, jež Xcode v režimu editace XIBů nabízí. Slíbili jsme si také, že dnes se podíváme na práci s vazbami mezi objekty.

Víme už, že – ponecháme-li prozatím stranou plnohodnotné objektové vazby ("bindings"), jež v iOSu nejsou k dispozici – vazby mezi objekty, jimiž je potřebujeme zabývat, jsou poměrně jednoduché; zahrnují vlastně jen

• tzv. "outlet", což je prostě atribut (typicky, ale ne nutně, instanční proměnná), obsahující adresu jiného objektu;

• tzv. "akce", což je zase "outlet", doprovázený proměnnou typu SEL a významem "zprávu, representovanou selektorem, poslat za určitých podmínek objektu, jenž je v 'outletu'"

Jak uvidíme níže, o nic jiného skutečně nejde; jen jediná "komplikace" (či chcete-li, jediné zvýšení flexibility oproti tomuto pohledu) spočívá v tom, že jak "outletů", tak i "akcí" můžeme za určitých podmínek navazovat více najednou.

Inspektor vazeb

Chceme-li si ověřit, jaké vazby ten který objekt v XIBu podporuje, použijeme inspektor, který jsme minule přeskočili: skrývá se pod celkem velmi logickou ikonkou šipky, a vypadá zhruba takto:

Jeho jednotlivé panely obsahují prvky, reprezentující odpovídající typy vazeb – Xcode tyto informace zjistí analýzou hlavičkových souborů (a v nejnovějších verzích vývojového prostředí – musím přiznat, že si teď nevybavuji, zda tuto možnost zavedlo Xcode 4.1 nebo beta 4.2; v Xcode 4.0 ještě není – i implementací):

• v panelu "Outlets" jsou jednoduché odkazy na ostatní objekty ("outlety"), typicky deklarované jako instanční proměnná nebo atribut s označením IBOutlet (k práci s vazbami v kódu se brzy vrátíme podrobněji). Kterýkoli z nich může obsahovat odkaz na libovolný objekt patřičné třídy;

• poměrně málo využívanou (a málo známou) možností jsou "Outlet Collections": to jsou atributy – opět obvykle, ale ne nutně, instanční proměnné – obsahující objekt třídy NSSet nebo NSArray s označením IBOutletCollection. Ty pak mohou obsahovat odkaz na libovolné množství objektů patřičné třídy;

• "Sent Events" je seznam událostí, jež u objektu dané třídy mohou vyvolat odeslání akce – na obrázku vidíme poměrně velmi bohatý seznam takových událostí pro tlačítko.

Zbývající trojice panelů je v jistém smyslu redundantní; usnadňuje ale velmi podstatným způsobem práci s XIBy a vazbami v nich. Obsahují totiž naopak vazby z ostatních objektů na tento, tedy:

• "Referencing Outlets" jsou 'outlety' ostatních objektů, jež obsahují právě odkaz na tento objekt;

• podobně je tomu s "Referencing Outlet Collections";

• a analogicky "Received Actions" ukazují, které objekty tomuto objektu posílají své akce.

Je vhodné zdůraznit určitý drobný, ale důležitý rozdíl mezi oběma "referencing" panely a panelem "received actions". Zatímco "referencing" nijak nesouvisí s vlastnostmi dané třídy – libovolný jiný objekt může ve svém "outletu" obsahovat odkaz na tento, bez jakýchkoli omezení, v panelu "Received Actions" vidíme právě všechny akce, jež tento objekt nabízí (deklarované v jeho rozhraní – a nově případně i jen v jeho implementaci – s označením IBAction).

Jinými slovy, možnosti dané třídy vidíme v panelech "Outlets", "Outlet Collections" a "Received Actions".

Její obsah – to, co lze v rámci editoru XIBů měnit – pak v panelech "Outlets", "Outlet Collections" a "Sent Events".

To proto, že "akce" je pasivní; objekt, který ji posílá, jen obsahuje obecný 'outlet' a selektor, ale definována je právě v objektu přijímajícím.

Jednoduché "drátování"

Asi nejjednodušší způsob sestavení jakékoli požadované vazby je tažení myší z "kolečka" při pravé straně inspektoru – můžeme vybrat prázdné i plné, a na stisknutí myší zareaguje zobrazením "+" – nad odpovídající objekt. Xcode zobrazí modrý "drát", který kolečko s objektem propojí; asi nějak takto:

Zvýrazňují se pouze objekty, jež patřičným způsobem připojit lze; je-li tedy např. "outlet" deklarován jako

@property (assign,nonatomic) IBOutlet UILabel *label;

pak se budou při tažení ignorovat všechny objekty, jež nejsou instancemi třídy UILabel (nebo některé z jejích podtříd).

Po uvolnění tlačítka myši se vazba uloží do XIBu. Konkrétní provedená akce samozřejmě závisí na tom, v jakém z panelů jsme kolečko vybrali:

• v panelu "Outlets" se prostě odkaz na cílový objekt uloží do zvoleného "outletu" (nebyl-li předtím "outlet" prázdný, nahradí ten minulý odkaz);

• v panelu "Outlet Collections" se odkaz přidá do seznamu k dříve existujícím;

• táhneme-li "drát" z panelu "Send Events", může být jeho cílem libovolný objekt, který obsahuje nějaké "akce"; po uvolnění tlačítka myši se zobrazí jejich nabídka, a my můžeme zvolit, ke které z nich událost, z jejíhož "kolečka" táhneme, připojit;

• podobně tomu je u obou "referencing" panelů – zde se ovšem po uvolnění tlačítka myši nabídne seznam "outletů" nebo "kolekcí outletů" cílového objektu, kam lze objekt, v jehož inspektoru jsme začali, vložit;

• konečně pak tažení z "Received Actions" může vést pouze nad objekty, jež samy obsahují nějaké události, schopné akci vyvolat – a po uvolnění tlačítka myši Xcode zobrazí seznam těchto událostí a nechá nám vybrat.

Alternativní možnosti

Xcode nabízí řadu jiných cest pro navázání požadovaného spojení, jež mohou být v konkrétním případě pohodlnější. Patří mezi ně

• klepnutí pravou klávesou na požadovaný objekt (nebo samozřejmě ekvivalentní klepnutí s přepínačem ctrl či dvěma prsty na trackpadu); to pro daný objekt otevře překryvný panel, obsahující inspektor vazeb, přímo na daném místě.

Chování tohoto panelu stojí za samostatnou poznámku: pokud klepneme mimo něj, automaticky se zavře. Pokud jej ale nejprve myší přemístíme (nebo změníme jeho velikost), zůstane na obrazovce tak dlouho, dokud jej nezavřeme pomocí "křížku" uvnitř; tak lze zároveň otevřít inspektory vazeb i pro více objektů najednou. Navíc jde o normální poctivé okno, jež můžeme na obrazovce umístit kamkoli: stačilo by tedy, aby tento inspektor šel přepínat i do ostatních režimů, a editor XIBů v Xcode by byl rázem mnohonásobně pohodlnější – bohužel, to v Apple nikoho nenapadlo :(

Další možnosti zahrnují

• přímé tažení mezi objekty: začneme-li táhnout nad některým z objektů s přidržením přepínače ctrl, Xcode "natáhne drát" stejně, jako kdybychom začali nad "kolečkem" v inspektoru. Při tomto "zrychleném" postupu se volí automaticky nejběžnější varianta; např. při tažení z tlačítka nemáme na vybranou mezi jeho "Send Events", ale automaticky se použije standardní "Touch Up Inside";

• otevřeme-li v jiném okně nebo v panelu "asistenta" hlavičkový soubor, můžeme táhnout "drát" přímo na "outlety" a "akce" ve zdrojovém kódu – bude to fungovat přesně stejně, jako kdybychom si je našli v inspektoru nebo zvolili z rozevírací nabídky:

• takto můžeme táhnout i nad prázdné místo ve zdrojovém kódu, a Xcode automaticky doplní potřebný "outlet" či "akci", spolu se souvisící funkčností (jako je @synthesize, uvolnění v metodě dealloc apod.). To je – jako většina generátorů kódu – naprosto skvělá věc pro předvádění možností vývojového prostředí, kde to oslní značným "wow faktorem"; v praxi při programování je to ale spíše nanic, protože jen málokdy je generovaný kód přesně takový, jaký skutečně chceme.

V nejnovějším Xcode dokonce v pruhu vlevo vedle zdrojového textu jsou "kolečka", jež umožní propojování "akcí" a "outletů" přesně týmž způsobem, jako výše popsaná "kolečka" v inspektorech. Valný smysl to v praxi nemá, mj. proto, že Xcode nedokáže korektně zpracovat naprosto běžné deklarace více atributů nebo instančních proměnných na jednom zdrojovém řádku, takže takto lze navazovat pouze prvou z nich (týmž omezením trpí i navazování "do zdrojového textu", ilustrované na minulém obrázku). Naopak velmi šikovnou vlastností nového vývojového prostředí je již zmíněná možnost navazovat přímo na "outlety" a "akce" v implementaci, aniž by bylo třeba je kopírovat do hlavičkových souborů.

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  

Diskuse k článku

 

Vložit nový příspěvek   Sbalit příspěvky

 

UIKit opět o míle dál než AppKit...

Autor: hroch32 Muž

Založeno: 14.09.2011, 23:10
Odpovědí: 0

Zajímalo by mě, jestli chtějí v Cupertinu taky někdy modernizovat AppKit podle UIKitu, když přinášejí to nejlepší z iOS do Masoxu. Takové IBOutletCollection nebo zrušení NSCell, to by byla věc :-)

Odpovědět na příspěvek

RE: UIKit opět o míle dál než AppKit...

Autor: PH Muž

Založeno: 15.09.2011, 17:53

Mohli by přenést UIKit.

Odpovědět na příspěvek

RE: RE: UIKit opět o míle dál než AppKit...

Autor: OC Muž

Založeno: 16.09.2011, 00:39

Což by byl velmi špatný nápad; AppKit je nesrovnatelně lepší v milionu malých drobností (kupříkladu cells, což je poměrně geniální věc, a jejich nahrazení views by byl hodně špatný nápad) a v jedné naprosto zásadní věci -- podpora bindings.

Ale nepřekvapilo by mne, kdyby to applovci přesto udělali, protože v poslední době vořou co mohou :(

Odpovědět na příspěvek

RE: RE: RE: UIKit opět o míle dál než AppKit...

Autor: PH Muž

Založeno: 16.09.2011, 09:10

Nepsal jsem nahradit.

Odpovědět na příspěvek

RE: RE: RE: RE: UIKit opět o míle dál než AppKit...

Autor: OC Muž

Založeno: 16.09.2011, 14:30

Dvě paralelní knihovny na totéž, každá fungující poněkud jinak, jsou opravdu přesně to, co Mac OS X potřebuje. Konečně jsme se zbavili šíleného Carbonu, a chtěl byste to zavádět znovu?!? :-O

Odpovědět na příspěvek

RE: RE: RE: RE: RE: UIKit opět o míle dál než AppKit...

Autor: PH Muž

Založeno: 16.09.2011, 14:41

Mám pocit, že Apple má ve svých knihovnách ("frameworks") duplicit dost. QTKit a AVFoundation například se dost překrývají. Což se někdy hodí, když mám applikaci pro iOS a chci kus kódu použít i na Macu. UI mě zrovna moc netrápí, byl to jen příklad (to se kliká v IB), ale práce s obrázky, zvukem, videem, tam je teď docela chaos.

Odpovědět na příspěvek

RE: RE: RE: RE: RE: RE: UIKit opět o míle dál než AppKit...

Autor: OC Muž

Založeno: 16.09.2011, 15:34

Amen. Právě proto bych relativně ocenil, kdyby se applovci aspoň pokusili týž bordel nezavádět tam, kde dosud není :)

BTW, právě v iOSu vinou toho, že chybí bindings, je GUI (tedy ani ne tak V jako hlavně C v MVC) bohužel spousta naprosto zbytečného programování tam, kde by v Mac OS X stačilo jen párkrát kliknout v IB. V poslední době toho píši víc pro iOS než pro Mac OS X, a právě na toto nadávám neustále a velmi sprostě :(

Odpovědět na příspěvek

RE: RE: RE: UIKit opět o míle dál než AppKit...

Autor: hroch32 Muž

Založeno: 19.09.2011, 19:37

Přenést ne, jen by mohli v AppKitu poslat pár věcí na odpočinek a implementovat je nově a lépe. Sice vím, jaké výhody přináší používání cells, ale UIKit je nemá, má místo nich view a musím přiznat, že mi to přijde lepší (a nejsem rozhodně sám). Nevylučuju ale, že bych změnil názor, když bych pro iOS začal programovat víc. Každopádně chybějící binding je tragédie...

Odpovědět na příspěvek

 

 

Vložit nový příspěvek

Jméno:

Pohlaví:

,

E-mail:

Předmět:

Příspěvek:

 

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: