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

Nástroj Apple Interface Builder ("IB") lze použít k vizuálnímu návrhu uživatelských rozhraní. Definice rozhraní vytvořené IB jsou uloženy v souborech .xib . Widgety a další objekty v souborech .xib mohou mít "identitu třídy", což může být vlastní uživatelem definovaný typ. 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é lze připojit k objektům rozhraní. Za běhu se načte IB. V té době se objekty vytvoří a výstupy a akce se dynamicky připojí k různým objektům 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 těm, které IB očekává. Visual Studio pro Mac ke zjednodušení kódu používá model podobný CodeBehind. Xcode má podobný Objective-C model. Ale model a konvence generování kódu Xamarin.iOS byly upraveny tak, aby byly pro vývojáře .NET lépe známé.

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 definované v jiných souborech .xib nebo definované čistě v kódu jazyka C#. Tvůrce rozhraní v současné době nezná podrobnosti o typech definovaných mimo aktuální soubor .xib , takže je nebude vypisovat ani zobrazovat vlastní výstupy a akce. Odebrání tohoto omezení se plánuje na nějakou dobu v budoucnu.

Vlastní třídy lze definovat v souboru .xib pomocí příkazu Přidat podtřídu na kartě Třídy Tvůrce rozhraní. Tyto třídy označujeme jako třídy CodeBehind. Pokud má soubor .xib v projektu soubor ".xib.designer.cs", Visual Studio pro Mac ho automaticky vyplní částečnými definicemi tříd pro všechny vlastní třídy v souboru .xib. Tyto částečné třídy označujeme jako "třídy návrháře".

Vytváření kódu

Generování kódu je povoleno přítomností souboru .xib.designer.cs pro libovolný{0} soubor .xib s akcí sestavení stránky.{0} Visual Studio pro Mac generuje částečné třídy v souboru návrháře pro všechny třídy uživatele, které může najít v souboru .xib. Visual Studio pro Mac generuje vlastnosti pro výstupy a částečné metody akcí.

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

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í pojm-in .NET. Pokud se výchozí obor názvů projektu změní, znovu vygenerované třídy budou používat nový obor názvů. Po regeneraci může dojít k tomu, že se vaše částečné třídy už neshodují.

Aby byla třída zjistitelná modulem Objective-C runtime, Visual Studio pro Mac aplikuje [Register (name)] atribut na třídu. I když Xamarin.iOS automaticky registruje NSObject-odvozené třídy, používá plně kvalifikované názvy .NET. Atribut použitý Visual Studio pro Mac přepíše chování Xamarin.iOS, aby se zajistilo, že každá třída je zaregistrována s názvem použitým 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. Díky tomu se spravované třídy shodují s očekávanými Objective-C názvy tříd.

Třídy nelze definovat ve více než jednom souboru .xib nebo dojde ke konfliktu.

Jiné části třídy než Návrhář

Částečné třídy Návrháře nejsou určeny k použití tak, jak jsou. Zásuvky jsou soukromé 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, která není návrhářem, v jiném souboru. Soubor "non-designer" nastaví základní třídu, manipuluje s výstupy a definuje konstruktory, které jsou nutné k vytvoření instance třídy z nativního kódu. Výchozí šablony .xib mají části třídy "non-designer", ale pro všechny ostatní vlastní třídy, které definujete v souboru .xib, musíte část bez návrháře přidat ručně.

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

Je konvenční umístit CodeBehind třídy do .xib.cs souboru vedle{0} souboru návrháře .xib.designer.cs.{0}

Generované akce a výstupy

V částečných tříd návrháře Visual Studio pro Mac generuje vlastnosti odpovídající všem připojeným výstupům definovaným v IB a částečné metody odpovídající všem 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 umožňují opožděnou vazbu. Jedná se o podrobnosti implementace mostu Xamarin.iOS do mostu Objective C. Představte si je jako ekvivalent privátních polí, jejichž účelem je použít pouze z CodeBehind třídy. Zpřístupní pole přidáním veřejného přístupového objektu do pole v části třídy, která není návrhářem.

Pokud jsou vlastnosti výstupu definovány tak, aby měly typ id (ekvivalent NSObject), 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 výstupu pro usnadnění. Toto chování však nemusí být v budoucích verzích podporováno. Při definování vlastní třídy doporučujeme explicitně explicitně zadávat 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, která není návrhář, Visual Studio pro Mac nabídne automatické dokončování podpisů všech neimplementovaných částečných metod.
  2. Podpisy částečné metody mají použitý atribut, který je zveřejňuje na Objective-C světě, aby se mohly zpracovat jako odpovídající akce.

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

Pokud jsou akce definované tak, aby měly typ id odesílatele (ekvivalentní NSObject), 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 dané akci. Toto chování však nemusí být v budoucích verzích podporováno. Doporučujeme explicitně zadat akce při definování vlastní třídy.

Tyto částečné metody se vytvářejí jenom pro C#, protože CodeDOM nepodporuje částečné metody. Negenerují se pro jiné jazyky.

Použití třídy Cross-XIB

Uživatelé někdy chtějí odkazovat na stejnou třídu z více souborů .xib , například pomocí kontrolerů karet. Definici třídy můžete explicitně odkazovat 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ý kvůli Visual Studio pro Mac zpracování souborů .xib jednotlivě. Visual Studio pro Mac nemůže rozpoznat a sloučit duplicitní definice. Pokud je stejná částečná třída definovaná ve více souborech návrháře, může dojít ke konfliktům při použití atributu Register vícekrát. Poslední verze Visual Studio pro Mac se pokusí vyřešit konflikty, ale nemusí vždy fungovat podle očekávání. V budoucnu se toto chování pravděpodobně stane nepodporovaným a místo toho Visual Studio pro Mac vytvoří všechny typy definované ve všech souborech .xib a spravovaný kód v projektu přímo viditelné ze všech souborů .xib.

Rozlišení typu

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

Generátor kódu v současné době nedokáže překládat typy CLR z Objective-C názvů typů v uživatelském kódu nebo knihovnách. V takových případech vypíše doslovné doslovné zadání názvu typu. Aby bylo možné správně přeložit typ CLR, musí mít stejný název jako Objective-C 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.