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:
Software
Převodníky, přepínače, placeholdery
1. srpna 2006, 00.00 | Slíbili jsme si, že si konečně vysvětlíme všechny ty podivné atributy a přepínače vazeb, jež máme k dispozici v inspektoru vazeb pod ovladači "Bind to" / "Controller Key" / "Model Key Path": o některých z nich jsme si sice už něco málo řekli (už například rozumíme přepínači "Continuously updates value"), ale většina z nich zůstává poněkud záhadou.
Předminule jsme změnili triviální NSObjectController na NSArrayController, jenž nám umožňuje pracovat s více datovými objekty v modelu; minule jsme na nový kontrolér navázali dvě tlačítka a tři sloupce tabulky, a s překvapením jsme zjistili, že výsledkem byla aplikace docela funkční a s poměrně bohatou sadou služeb.
Slíbili jsme si také, že si konečně vysvětlíme všechny ty podivné atributy a přepínače vazeb, jež máme k dispozici v inspektoru vazeb pod ovladači "Bind to" / "Controller Key" / "Model Key Path": o některých z nich jsme si sice už něco málo řekli (už například rozumíme přepínači "Continuously updates value"), ale většina z nich zůstává poněkud záhadou.
Value Transformer
Ačkoli konkrétní skupina možností a přepínačů, jež jsou nám k dispozici, se pro různé vazby poněkud liší, "Value Transformer" mají všechny.
My již ale převodníky hodnot dobře známe a naučili jsme se i vytvářet vlastní: do textového pole prostě zadáme jméno, pod nímž byl převodník zaregistrován příkazem
[NSValueTransformer setValueTransformer:... forName:...]
Cocoa standardně nabízí následující převodníky:
- NSNegateBooleanTransformer: s tímto převodníkem jsme se již setkali; převede hodnotu NO (tedy v kontextu jazyka C cokoli nulového) na YES (tedy hodnotu nenulovou) a naopak. Hodí se kdykoli chceme určovat kupříkladu přístupnost prvků uživatelského rozhraní, a máme zrovna náhodou k dispozici pouze opačnou hodnotu (tedy "ano" právě když prvek přístupný být nemá a vice versa);
- NSIsNilTransformer: prostě a jednoduše převede nil na YES a jakýkoli existující objekt na NO; v praxi se hodí v podobných případech jako ten minulý – tedy určujeme-li přístupnost prvků GUI, tentokrát ale na základě existence či neexistence objektů;
- NSIsNotNilTransformer: obyčejná negace toho minulého; nebyl by zapotřebí, kdybychom mohli převodníky hodnot řetězit;
- NSUnarchiveFromDataTransformer: po cestě "tam" je jeho vstupním typem objekt třídy NSData, a převodník získá výsledek tak, že na data "pustí" standardní dearchivaci. Funguje i na druhou stranu; pak naopak libovolný objekt zaarchivuje a vrátí výsledná data. Nejčastěji jej využijeme při vazbách na NSUserDefaultsController, kdy nám umožňuje do aplikačních předvoleb přímo ukládat objekty typu NSFont či NSColor.
Přepínače
Panely pro nastavování vazeb nabízejí řadu přepínačů. U každé z vazeb jsou přepínače trochu odlišné; s některými jsme se již seznámili – např. víme, že zapneme-li přepínač "Continuously updates value", bude prvek grafického uživatelského rozhraní, jehož vazbu nastavujeme, odesílat změny navázané hodnoty patřičnému kontroléru ihned; ponecháme-li jej vypnutý, odešle změny až při ukončení editace.
Další častěji užívané přepínače jsou
- Allows Editing Multiple Values Selection: zde si musíme připomenout speciální zástupný objekt, který kontroléry nabízejí v atributu "selection": ten representuje všechny označené objekty, a nabízí přístup k jejich atributům. Pokud tento přepínač zapneme, zástupný objekt umožní editaci daného atributu více objektů najednou (nová hodnota se prostě uloží do všech); vypneme-li jej, nebude to možné, a objekty budeme moci editovat pouze jeden po druhém;
- Conditionally Sets Editable: velmi často užívaný atribut; automaticky řídí možnost editace podle toho, které objekty jsou vybrány, a editaci umožní pouze v případě, že to dává smysl;
- Conditionally Sets Enabled/Hidden: alternativní verse minulého přepínače, jež namísto atributu "editable" řídí atribut "enabled", případně ovladač zcela skrývají;
- Inserts Null Placeholder: velmi šikovný přepínač v případě, že užíváme vazby pro vyplnění rozevírací nabídky, jež má mít stálý a neměnný titulek – pokud jej zapneme, vazba automaticky před "skutečné" hodnoty vloží nil (který rozevírací nabídka právě dokáže nahradit stálým titulkem);
Kromě toho samozřejmě některé vazby nabízejí další přepínače; na jejich podrobný popis už ale v tomto přehledném článku není místo; v praxi se s nimi stejně setkáme poměrně málokdy.
Zástupné hodnoty
Především se omlouvám čtenářům za užití ohavného anglicismu "placeholdery" v titulku tohoto článku; nedokázal jsem však odolat roztomilé aliteraci.
Ohledně smyslu a užití zástupných hodnot ("placeholders") si opět připomeňme funkci atributu "selection": jeho obsahem nejsou přímo vybrané datové objekty modelu (ty můžeme, chceme-li, získat prostřednictvím atributu "selectedObjects"), nýbrž chytrý pomocný objekt, který podle potřeby zpřístupňuje atributy vybraných datových objektů.
Pomocný objekt "selection" přitom ale může zjistit, že atributy vybraných datových objektů zpřístupnit nelze, neboť
- je vybraných objektů více. Pomocný objekt "selection" se v takovém případě ještě pokusí zjistit, zda náhodou nemají všechny touž hodnotu daného atributu (není-li to zakázáno pomocí přepínače "Always uses multiple value markers", s nímž jsme se seznámili minule) – pak ji může vrátit; v opačném případě však namísto toho vrátí speciální zástupnou hodnotu, jejíž význam je "více vybraných objektů";
- není vybrán žádný datový objekt. Pak samozřejmě pomocný objekt "selection" nemá na vybranou, a nemůže než vrátit jinou speciální zástupnou hodnotu, jejíž význam je "nic není vybráno";
- některý z vybraných datových objektů vůbec nemá patřičný atribut (tj. ne že by jeho hodnota byla prázdná, ale vůbec neexistuje – datový objekt dané jméno atributu vůbec nepodporuje, a pokus získat s tímto jménem hodnotu pomocí zprávy valueForKey: vyvolá výjimku). V takovém případě pomocný objekt "selection" buď výjimku předá dále (je-li zapnutý přepínač "Raises for Not Applicable Keys", který již známe dávno), nebo ji naopak "spolkne" a vrátí další speciální zástupnou hodnotu, jejíž význam je "vybrané objekty nepodporují zvolený atribut".
Objekty grafického uživatelského rozhraní dokáží na tyto speciální zástupné hodnoty patřičně reagovat, a my pro ně můžeme určit, co se má zobrazit – kupříkladu "pokud je vybráno více objektů s různými hodnotami atributu, napiš do textového pole 'Změna se projeví ve všech vybraných objektech'". K tomu právě slouží čtveřice textových polí "... Placeholder" v editoru vazeb.
Tak tedy cokoli, co zapíšeme do textového pole "Multiple Values Placeholder", objekt GUI použije právě v případě, kdy od kontroléru (respektive od jeho pomocného objektu "selection") dostane speciální zástupnou hodnotu, jejíž význam je "více vybraných objektů". Případný text, který uložíme do textového pole "No Selection Placeholder", se použije právě tehdy, kdy kontrolér vrátí speciální zástupnou hodnotu "nic není vybráno". Konečně obsah textového pole "Not Applicable Placeholder" bude objektem grafického uživatelského rozhraní použit v případě, kdy mu kontrolér vrátí speciální zástupnou hodnotu, jejíž význam je "vybrané objekty nepodporují zvolený atribut".
Čtvrté z "placeholderových" textových polí má malinko jiné postavení – není vázáno na žádnou speciální zástupnou hodnotu, již by kontrolér vracel –, ale v praxi se hodí neméně často (spíše ještě častěji): ono se totiž může stát, že daný atribut vybraného datového objektu sice existuje, avšak žádnou hodnotu nemá (jinými slovy, zpráva valueForKey: pro tento atribut vrátí hodnotu nil). To je zcela normální, korektní situace, a kontrolér se o ni nijak zvlášť nestará – jeho zástupný objekt "selection" prostě také vrátí nil a je to. Naproti tomu, velice často se nám hodí na úrovni grafického uživatelského rozhraní "prázdnou" hodnotu nil zobrazit nějakým speciálním způsobem – a k tomu právě slouží čtvrté, poslední textové pole "Null Placeholder": jeho obsah objekt GUI použije právě tehdy, když v rámci dané vazby dostane od kontroléru hodnotu nil. Obvykle do tohoto pole zapisujeme něco jako "-- beze jména --" 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