Generování kódu .xib v Xamarin.iOS

K vizuálnímu Interface Builder uživatelských rozhraní je možné použít nástroj Apple Interface Builder (IB). Definice rozhraní vytvořené IB se ukládají do souborů .xib . Widgetům a dalším objektům v souborech .xib může být dána "identita třídy", což může být vlastní typ definovaný uživatelem. Použití vlastních typů umožňuje přizpůsobit chování widgetů a psát vlastní widgety.

Tyto třídy uživatelů jsou obvykle podtřídy tříd kontroleru uživatelského rozhraní. Mají výstupy (vlastnosti) a akce (události), které je možné připojit k objektům rozhraní. Za běhu se načte IB. V té době jsou objekty vytvořeny a výstupy a akce jsou dynamicky propojeny s různými objekty uživatelského rozhraní. Při definování těchto spravovaných tříd musíte definovat všechny akce a výstupy tak, aby odpovídaly akcím, které IB očekává. Visual Studio pro Mac kódu používá model jako CodeBehind. Xcode má podobný Objective-C model. Model a konvence generování kódu Xamarin.iOS byly vylepšovány tak, aby byly pro vývojáře .NET známější.

Soubory .xib a vlastní třídy

Kromě použití existujících typů z Cocoa Touch je možné definovat vlastní typy v souborech .xib . Je také možné použít typy, které jsou definovány v jiných souborech .xib nebo definované čistě v kódu jazyka C#. V Interface Builder si není vědom podrobností o typech definovaných mimo aktuální soubor .xib , takže je nebude zobrazovat ani zobrazovat vlastní výstupy a akce. Odstranění tohoto omezení se plánuje na budoucí dobu.

Vlastní třídy je možné definovat v souboru .xib pomocí příkazu Přidat podtřídu na kartě Třídy Interface Builder. Tyto třídy se na tyto třídy odkazují jako na třídy CodeBehind. Pokud má soubor .xib v projektu soubor protějšku .xib.designer.cs, pak ho Visual Studio pro Mac automaticky vyplní definicemi částečných tříd pro všechny vlastní třídy v souboru .xib. Na tyto částečné třídy odkazujeme jako na "třídy návrháře".

Vytváření kódu

Generování kódu je povoleno přítomností souboru .xib.designer.cspro libovolný soubor .xib s akcí sestavení Page. Visual Studio pro Mac generuje částečné třídy v souboru návrháře pro všechny třídy uživatelů, které může najít v souboru .xib. Visual Studio pro Mac generuje vlastnosti výstupů a částečné metody pro akce.

Soubor návrháře se automaticky aktualizuje, když se změní soubor .xib a Visual Studio pro Mac znovu fokus. Provádění změn v souboru návrháře se nedoporučuje, protože změny se přepíšou při Visual Studio pro Mac souboru.

Registrace a obory názvů

Visual Studio pro Mac generuje třídy návrháře pomocí výchozího oboru názvů projektu pro umístění souboru návrháře. Toto chování je konzistentní s normální generováním oboru názvů projektu .NET. Obor názvů souborů návrháře používá výchozí obor názvů projektu a jeho nastavení zásad pojmenování .NET. Pokud se změní výchozí obor názvů vašeho projektu, nové třídy budou používat nový obor názvů. Po opětovném zgenerování můžete zjistit, že se vaše částečné třídy už neshodují.

Aby byla třída zjistitelná pomocí modulu Objective-C runtime, Visual Studio pro Mac na [Register (name)] třídu použije atribut . I když Xamarin.iOS automaticky registruje NSObjectodvozené třídy, používá plně kvalifikované názvy .NET. Atribut použitý atributem Visual Studio pro Mac přepisuje chování Xamarin.iOS, aby se zajistilo, že každá třída je zaregistrovaná pomocí názvu použitého v souboru .xib. Přidejte atribut ručně pro všechny vlastní třídy definované pomocí IB bez použití Visual Studio pro Mac ke generování souborů návrháře. Tím zajistíte, že spravované třídy budou odpovídat očekávaným názvům Objective-C tříd.

Třídy nelze definovat ve více než jednom souboru .xib, jinak budou v konfliktu.

Části třídy bez návrháře

Částečné třídy návrháře nejsou určené k použití tak, jak jsou. Výstupy jsou privátní a není zadána žádná základní třída. Očekává se, že každá třída bude mít odpovídající část třídy "bez návrháře" v jiném souboru. Soubor "bez návrháře" nastaví základní třídu, manipuluje s výstupy a definuje konstruktory potřebné k vytvoření instance třídy z nativního kódu. Výchozí šablony .xib mají části třídy "bez návrháře", ale pro všechny další vlastní třídy, které definujete v souboru .xib, je nutné přidat část, která není návrhářem, ručně.

Toto oddělení pomocí částečných tříd je potřeba pro flexibilitu. Například několik tříd CodeBehind může podtřídu společné spravované abstraktní třídy, která podtřídu třídy, která má být podtřídou podle IB.

Je běžné umístit třídy CodeBehind do souboru .xib.cs vedle souboru návrháře .xib.designer.cs .

Vygenerované akce a výstupy

V částečných třídách návrháře Visual Studio pro Mac vlastnosti odpovídající připojeným výstupům definovaným v IB a částečné metody odpovídající připojeným akcím.

Vlastnosti výstupu

Třídy návrháře obsahují vlastnosti odpovídající všem výstupům definovaným ve vlastní třídě. Tyto vlastnosti povolte opožděnou vazbu. Jsou to podrobnosti implementace přemostění Xamarin.iOS do Objective C. Představte si je jako ekvivalent soukromých polí, která mají být použita pouze z třídy CodeBehind. Napište pole jako veřejné přidáním veřejného přístupového objekt do pole v části třídy bez návrháře.

Pokud jsou vlastnosti id výstupu definovány tak, aby měl typ ( NSObjectekvivalentní vlastnosti ), pak generátor kódu návrháře v současné době určuje nejsilnější možný typ na základě objektů připojených k této zásuvce pro usnadnění. Toto chování však nemusí být podporováno v budoucích verzích. Při definování vlastní třídy se doporučuje explicitně zazadat výstupy.

Vlastnosti akce

Třídy návrháře obsahují částečné metody odpovídající všem akcím definovaným ve vlastní třídě. Tyto metody nemají implementaci. Účel částečných metod je dvojí:

  1. Pokud zadáte partial text třídy části třídy mimo návrháře, Visual Studio pro Mac nabídne automatické dokončování podpisů všech ne implementované částečné metody.
  2. U podpisů částečných metod se používá atribut Objective-C , který je zpřístupňuje celému světu, aby je bylo možné zpracovat jako odpovídající akci.

Částečnou metodu můžete ignorovat a implementovat akci použitím atributu na jinou metodu. Nebo ji nechte propadnout do základní třídy.

Pokud jsou akce definované id tak, aby měl typ odesílatele ( NSObjectodpovídá ), pak generátor kódu návrháře aktuálně určí nejsilnější možný typ na základě objektů připojených k této akci. Toto chování však nemusí být podporováno v budoucích verzích. Při definování vlastní třídy se doporučuje explicitně zadat akce.

Tyto částečné metody jsou vytvořeny pouze pro jazyk C#, protože codeDOM nepodporuje částečné metody. Negenerují se pro jiné jazyky.

Použití tříd mezi XIB

Někdy chtějí uživatelé odkazovat na stejnou třídu z více souborů .xib , například pomocí kontrolerů karet. Můžete explicitně odkazovat na definici třídy z jiného souboru .xib nebo znovu definovat stejný název třídy ve druhém souboru .xib.

Druhý případ může být problematický, protože Visual Studio pro Mac jednotlivě zpracovávat soubory .xib. Visual Studio pro Mac nemůže rozpoznat a sloučit duplicitní definice. Pokud je stejná částečná třída definována ve více souborech návrháře, může dojít ke konfliktům při použití atributu Register vícekrát. Nedávné verze Visual Studio pro Mac pokusí konflikty vyřešit, ale nemusí vždy fungovat podle očekávání. V budoucnu bude toto chování pravděpodobně nepodporované a místo toho Visual Studio pro Mac všechny typy definované ve všech souborech .xib a spravovaném kódu v projektu přímo viditelné ze všech souborů .xib.

Překlad typů

Typy používané v IB jsou názvy typů Objective-C mapované na typy CLR pomocí atributů Register. Při generování kódu Visual Studio pro Mac překládá typy CLR a Objective-C plně kvalifikuje názvy typů na typy. Tyto Objective-C typy jsou zabalené jádrem Xamarin.iOS.

Generátor kódu aktuálně nemůže překládá typy CLR z názvů Objective-C typů v uživatelském kódu nebo knihovnách. V takových případech výstupem je doslovný název typu . Aby typ CLR správně překládá, Objective-C musí mít stejný název jako typ . Typ CLR musí být ve stejném oboru názvů jako kód, který ho používá. Budoucí verze generátoru kódu budou zvažovat všechny Objective-C typy v projektu.