Práce s polem objektů - 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:

Seriály

Více seriálů



Software

Práce s polem objektů

7. července 2006, 00.00 | Daleko více zábavy si můžeme užít s kontrolérem polí, jenž je representován objektem třídy NSArrayController; dnes a v několika dalších dílech se mu proto podíváme důkladně na zoubek.

V několika předcházejících dílech jsme si ukázali řadu triků, jež nám dokáží výrazně usnadnit práci, pokud využijeme v prostředí Cocoa systém vazeb a kontroléry. Doposud jsme se ovšem zabývali pouze triviálním kontrolérem NSObjectController, který celkem vzato neumí zhola nic, a bez nějž bychom se nakonec mohli obejít (nebýt správy editorů, již zajišťuje prostřednictvím protokolů NSEditor a NSEditorRegistration, vlastně by kontrolér nedělal celkem nic jiného, nežli že pro nás automaticky vytvoří modelový objekt).

Daleko více zábavy si můžeme užít s kontrolérem polí, jenž je representován objektem třídy NSArrayController; dnes a v několika dalších dílech se mu proto podíváme důkladně na zoubek.

Hlavní atributy kontroléru

Na rozdíl od objektového kontroléru, s nímž jsem pracovali dosud, a který se dokázal postarat pouze o jediný modelový objekt, dokáže NSArrayController spravovat objektů libovolně mnoho. Proto také nabízí více možností přístupu k nim: zatímco dosud byl v podstatě jediný rozumný atribut kontroléru "selection" (a jeho název ani nedával moc valný smysl), nyní máme k dispozici atributů mnohem více; mezi ty nejzákladnější patří

  • arrangedObjects: representuje všechny zobrazované objekty modelu, jež kontrolér spravuje, v pořadí daném právě platným tříděním;
  • selection: tento atribut, který jsme celkem mechanicky používali u NSObjectControlleru, najednou dává velmi rozumný smysl: representuje totiž to, co je právě v kontroléru vybráno: zvolený objekt – nebo také několik zvolených objektů, nebo nic, pokud je výběr prázdný;
  • selectedObjects: tento atribut representuje pole vybraných objektů; jeho funkce je tedy velmi podobná atributu "selection". Připadá vám, že nejméně jeden z atributů "selection" a "selectedObjects" je zbytečný? Není tomu tak, a za malou chvilku si vysvětlíme proč;
  • canRemove: atributů "canXyz" nabízí NSArrayController celou řadu, a nemělo by smysl se sem s nimi opisovat; asi nejvýznamnější z nich je právě tento. Můžeme jej použít pro libovolnou vazbu – NSArrayController v něm neustále udržuje informaci o tom, zda lze vybrané objekty zrušit nebo ne.

Kontrolér nabízí atributů ještě více; prozatím si ale vystačíme právě s těmito.

Nejprve si vysvětlíme záhadu atributů "selection" a "selectedObjects": právě zde se nám totiž začíná velice vyplácet to, že namísto přímé vazby mezi objekty grafického uživatelského rozhraní a objekty modelu požíváme kontrolérů. Nejde jen o to, že kontrolér udržuje takové věci jako setřídění objektů či jejich výběr; trik je v tom, že "selection" je vždy právě jeden zástupný objekt, který "chytře" nabízí přístup k atributům vybraných objektů prostřednictvím svých přejatých atributů; "selectedObjects" je naproti tomu prostě a jednoduše pole všech vybraných objektů.

Ještě není docela jasno? Inu, představme si třeba, že je v kontroléru vybráno několik objektů. Atribut "selectedObjects" pak je prostě pole těchto objektů; použijeme-li KVC, abychom získali hodnotu nějakého atributu – kupříkladu tedy příkazem [kontrolér valueForKey:@"selectedObjects.firstname"] – dostaneme opět pole křestních jmen; s tím se nic moc rozumného dělat nedá.

Naproti tomu atribut "selection" obsahuje jeden jediný objekt, který "ví", co je v kontroléru vybráno, a dokáže s tím patřičně zacházet. Vyžádáme-li si tedy kupříkladu hodnotu atributu "firstname" pomocí příkazu [kontrolér valueForKey:@"selection.firstname"], zástupný objekt ověří, zda náhodou nemají všechny vybrané objekty shodné křestní jméno (a ano-li, toto jméno vrátí); jinak nám předá zástupnou hodnotu, již můžeme třeba zobrazit speciálním způsobem...

Kromě toho, že zástupný objekt "selection" nabízí bohatší služby, je také obecně mnohem efektivnější, než kdybychom pracovali přímo s polem objektů.

Služby kontroléru

Vedle atributů nabízí NSArrayController také řadu standardních akcí, na něž můžeme navazovat prvky z grafického uživatelského rozhraní pomocí standardního "tahání drátů". I akcí je celá řada; nejdůležitější z nich jsou asi insert: a remove: – první z nich vytvoří nový datový objekt modelové třídy a vloží jej do spravovaného pole; druhá naopak z pole odstraní všechny právě vybrané objekty.

Jak dostat NSArrayController do NIBu?

Pokud sestavujeme nové grafické uživatelské rozhraní, není nic snazšího: prostě z palety "Cocoa–Controllers" vhodíme myší do okna NIBu NSArrayController a je to.

Teď zrovna se nám to ale příliš nehodí, neboť my již kontrolér máme, a máme na něj navázanou řadu prvků GUI; tyto vazby bychom chtěli zachovat, a jen bychom rádi změnili typ kontroléru z NSObjectController na NSArrayController. Ačkoli Interface Builder je pro nastavení požadované třídy vybaven (lze to dělat v inspektoru "Custom Class"), tato služba nám také nepomůže, neboť ta ve skutečnosti třídu objektu nezmění – jen nastaví příznak, aby se zvolená třída použila při načítání NIBu do paměti.

Nechceme-li tedy všechny vazby nastavovat znovu, musíme použít trochu hrubé síly: naštěstí současný Interface Builder dokáže ukládat NIBy v textovém formátu, takže to není zase až tak příliš pracné. Nejprve tedy uložíme NIB v textovém formátu – přímo v ukládacím panelu na to máme přepínač:

Pak ve Finderu nalezneme NIB a otevřeme jeho obsah pomocí příkazu "Show Package Contents" z kontextové nabídky. Uvnitř uvidíme trojici textových souborů, z nichž nás zajímá pouze jeden – "keyedobjects.nib". Ten přeneseme ven z package (bohužel, firma Apple již dávno "vylepšila" Open Panel aplikací tak, že se jeho pomocí např. z TextEditu dovnitř nedostaneme), a otevřeme jej v TextEditu (nebo jakémkoli jiném textovém editoru) s kódováním UTF-8.

Uvnitř textu nalezneme výskyt řetězce "NSObjectController"; ten vypadá nějak takto:

<dict>
	<key>$classes</key>
	<array>
		<string>NSObjectController</string>
		<string>NSController</string>
		<string>NSObject</string>
	</array>
	<key>$classname</key>
	<string>NSObjectController</string>
</dict>

a upravíme jej, aby správně odpovídal nové požadované třídě, tedy NSArrayControlleru:

<dict>
	<key>$classes</key>
	<array>
		<string>NSArrayController</string>
		<string>NSObjectController</string>
		<string>NSController</string>
		<string>NSObject</string>
	</array>
	<key>$classname</key>
	<string>NSArrayController</string>
</dict>

Opravený soubor uložíme, přeneseme jej zpět do package, a jakmile příště otevřeme NIB, uvidíme v něm již správný NSArrayController. S ním si ale začneme hrát až zase příště.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Software  

 

 

 

Nejčtenější články
Nejlépe hodnocené články
Apple kurzy

 

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

Uživatelské jméno:

Heslo: