Nastal čas na kakao - Přehled tříd AppKitu 2 - 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

Nastal čas na kakao - Přehled tříd AppKitu 2

6. října 2005, 00.00 | V minulém dílu našeho seriálu o vývojovém prostředí Cocoa jsme se začali v přehledu seznamovat se všemi třídami – nebo aspoň s většinou nejdůležitějších tříd – objektové knihovny AppKit. Dnes budeme pokračovat.

V minulém dílu našeho seriálu o vývojovém prostředí Cocoa jsme se začali v přehledu seznamovat se všemi třídami – nebo aspoň s většinou nejdůležitějších tříd – objektové knihovny AppKit. Dnes budeme pokračovat.

Zopakujme si úvodní obrázek (který mohou ti, kdo mají instalované vývojářské prostředí, nalézt v plném rozlišení úvodním článku popisu AppKitu):

V pořadí shora dolů je na řadě nyní NSResponder a jeho podtřídy.

Co je to responder a k čemu je to dobré?

U moderního aplikačního frameworku, jakým AppKit je – ve skutečnosti i přes jeho značné stáří (základy AppKitu byly položeny již v prvních versích operačního systému NeXTStep v osmdesátých letech minulého století), je AppKit patrně v současnosti nejlepším a nejmodernějším aplikačním systémem, jaký existuje; kupříkladu knihovny Javy se s ním ani zdaleka nemohou měřit – je samozřejmé, že se zcela automaticky postará o správu a zpracování událostí.

Zpracování vlastních událostí generovaných klávesnicí, myší, časovačem, ostatními aplikacemi a podobně je doménou tříd NSEvent a NSRunLoop, jimiž se budeme zabývat až jindy. Nyní nás zajímá, co AppKit s již "hotovou" – tedy přijatou událostí – udělá. Je zřejmé, že logika zpracování by měla být zhruba následující:

  • události klávesnice dostane aktivní textový objekt (s trochou zjednodušení můžeme říci, že to je právě ten objekt, v němž právě bliká textový kursor);
  • pokud je tento objekt nedokáže zpracovat, musí je předat ostatním objektům "v okolí" – např. tlačítkům v témže okně;
  • jinak musí být k dispozici službám okna samotného (přesněji řečeno, dokumentu, který je oknem representován);
  • nebo – jde-li o globální služby, nezávislé na dokumentu – musí nakonec dostat možnost zpracovat takovou událost sama aplikace (resp. její kontrolér).

U událostí, generovaných pomocí myši, je logika zpracování zhruba podobná; jen jako první musí mít možnost takovou událost zpracovat právě ten grafický objekt, který je zrovna "pod" kurzorem myši.

Řešení, jež pro tento problém NeXTStep našel a prostředí Cocoa převzalo je (alespoň koncepčně) jednoduché, a velmi elegantní. Existuje universální abstraktní třída NSResponder, jež definuje všechny standardní události, jež se mohou v systému vyskytnout: jsou zde tedy např. metody mouseDown:, scrollWheel:, keyDown:, flagsChanged: a mnohé další.

Aplikační systém pak neustále udržuje několikaúrovňovou strukturu "respondérů": respondér může (ale nemusí) přijímat status "aktivního textového objektu" (v Cocoa se to nazývá firstResponder), mezi respondery je definováno i pořadí, v němž si tento status podle potřeby mohou předávat. Jakmile se v systému objeví událost, aplikační framework najde podle výše popsaných pravidel (resp. na témže principu – ve skutečnosti jsou samozřejmě pravidla o něco složitější) vhodný responder, a tomu událost předá. Pokud ji responder zpracuje, výborně; jinak dostane šanci další responder – např. tedy nejprve textové pole, pak okno, v němž je pole umístěno, a nakonec aplikace, jejíž součástí okno je.

Jak je vidět na obrázku, responderem může být leccos; nejvýznamnější jsou však právě třídy NSView – o views jsme mluvili už minule v odstavci "Cell a View", jimi jsou právě representovány všechny viditelné objekty –, pak objekty NSWindow, jež representují okna jako taková (jejich obsah je samozřejmě zobrazen pomocí objektů NSView), a konečně NSApplication, jež representuje aplikaci jako celek. NSWindowController pak jen usnadňuje korektní rozdělení služeb aplikace v modelu MVC, a NSDrawer je v podstatě jen speciální typ okna.

NSResponder toho má "v referátu" ještě daleko více, ale na to se podíváme až později, až se budeme zabývat konkrétními možnostmi této třídy a jejich využitím. Za samostatnou zmínku snad stojí ještě interpretace abstraktních příkazů – příkazy, zadané prostřednictvím klávesnice, za normálních okolností NSResponder nepředává rovnou dál, ale nejprve je převádí na odpovídající objektové zprávy, takže stiskneme-li např. klávesu Enter, ve standardním programu nedostane náš textový objekt zprávu keyDown: s argumentem odpovídajícím kódu této klávesy; to by ponechávalo příliš mnoho práce na jednotlivých objektech. Namísto toho příkaz zpracuje přímo NSResponder, a textový objekt dostane rovnou zprávu insertLineBreak:.

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

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Software  

 

 

 

 

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

Uživatelské jméno:

Heslo: