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

Nástroj Apple Interface Builder ("IB") se dá použít k vizuálnímu navrhování uživatelských rozhraní.The Apple Interface Builder tool ("IB") can be used to design user interfaces visually. Definice rozhraní vytvořené IB jsou uloženy v souborech . xib .The interface definitions created by IB are saved in .xib files. Widgetům a jiným objektům v souborech . xib může být udělena "identita třídy", což může být vlastní uživatelsky definovaný typ.Widgets and other objects in .xib files may be given a "class identity", which can be a custom user-defined type. Použití vlastních typů vám umožní přizpůsobit chování widgetů a napsat vlastní widgety.Using custom types allows you to customize the behavior of widgets and to write custom widgets.

Tyto třídy uživatelů jsou obvykle podtřídou tříd řadiče uživatelského rozhraní.These user classes are normally subclasses of UI controller classes. Mají vzlety (vlastnosti) a Akce (události), které mohou být připojeny k objektům rozhraní.They have outlets (properties) and actions (events) that can be connected to interface objects. V době běhu se načtou IB.At runtime, the IB is loaded. V tomto okamžiku jsou objekty vytvořeny a operace a akce jsou propojeny s různými objekty uživatelského rozhraní dynamicky.At that time, the objects are created, and the outlets and actions are connected to the various UI objects dynamically. Při definování těchto spravovaných tříd musíte definovat všechny akce a výstupy, aby odpovídaly těm, které IB očekává.When defining these managed classes, you must define all the actions and outlets to match the ones that IB expects. Visual Studio pro Mac používá model typu CodeBehind pro zjednodušení kódu.Visual Studio for Mac uses a CodeBehind-like model to simplify the code. Xcode má podobný model cíl-C.Xcode has a similar Objective-C model. Ale model a konvence pro generování kódu Xamarin. iOS jsme vylepšili tak, aby se lépe seznámili s vývojáři rozhraní .NET.But the Xamarin.iOS code generation model and conventions have been tweaked to be more familiar to .NET developers.

Soubory. xib a vlastní třídy.xib Files and Custom Classes

Je možné definovat vlastní typy v souborech . xib , kromě používání stávajících typů z kakaového dotyku.It's possible to define custom types in .xib files, in addition to using the existing types from Cocoa Touch. Je také možné použít typy, které jsou definovány v jiných souborech . xib nebo definovat čistě v kódu jazyka C#.It's also possible to use types that are defined in other .xib files, or defined purely in C# code. V současné době Interface Builder nevědí o podrobnostech typů definovaných mimo aktuální soubor . xib , takže se neobjeví ani nezobrazí vlastní akce a akce.Currently, Interface Builder isn't aware of the details of types defined outside the current .xib file, so it won't list them or show their custom outlets and actions. Odebrání tohoto omezení se v budoucnu plánuje na nějakou dobu.Removing this limitation is planned for sometime in the future.

Vlastní třídy lze definovat v souboru . xib pomocí příkazu přidat podtřídu na kartě třídy Interface Builder.Custom classes can be defined in a .xib file using the "Add Subclass" command in the "Classes" tab of Interface Builder. Na tyto třídy odkazujeme jako na třídy CodeBehind.We refer to those classes as "CodeBehind" classes. Pokud soubor . xib obsahuje v projektu soubor s protějškem ". XIB.Designer.cs", pak Visual Studio pro Mac automaticky vyplní definice částečné třídy pro všechny vlastní třídy v souboru . xib.If the .xib file has a ".xib.designer.cs" counterpart file in the project, then Visual Studio for Mac will automatically fill it with partial classes definitions for all the custom classes in the .xib. Na tyto částečné třídy odkazujeme jako na "třídy návrháře".We refer to these partial classes as "designer classes".

Vytváření kóduGenerating Code

Generování kódu je povoleno přítomností souboru {0} . XIB.Designer.cs pro libovolný soubor {0} . xib s akcí Build stránky.Code generation is enabled by the presence of a {0}.xib.designer.cs file, for any {0}.xib file with a build action of Page. Visual Studio pro Mac generuje v souboru návrháře částečné třídy pro všechny třídy uživatele, které může najít v souboru . xib .Visual Studio for Mac generates partial classes in the designer file for all of the user classes it can find in the .xib file. Visual Studio pro Mac generuje vlastnosti pro výstupy a částečné metody pro akce.Visual Studio for Mac generates properties for outlets and partial methods for actions.

Soubor návrháře se automaticky aktualizuje, když se změní soubor . xib a Visual Studio pro Mac znovu získá fokus.The designer file is automatically updated when the .xib file changes and Visual Studio for Mac regains focus. Provádění změn v souboru návrháře se nedoporučuje, protože změny budou při příštím Visual Studio pro Mac aktualizaci souboru.Making changes to the designer file isn't recommended as changes will be overwritten next time Visual Studio for Mac updates the file.

Registrace a obory názvůRegistration and Namespaces

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.Visual Studio for Mac generates the designer classes using the project's default namespace for the designer file location. Toto chování je konzistentní s normálním generováním oboru názvů projektu .NET.This behavior is consistent with normal .NET project namespace generation. Obor názvů souborů návrháře používá výchozí obor názvů projektu a jeho nastavení "zásady vytváření názvů .NET".The namespace of designer files uses the project's "default namespace" and its ".NET naming policies" settings. Pokud se změní výchozí obor názvů vašeho projektu, znovu vygenerované třídy použijí nový obor názvů.If your project's default namespace changes, the regenerated classes will use the new namespace. Po obnovení můžete najít částečné třídy, které se již neshodují.After regeneration, you may find your partial classes no longer match up.

Aby třída mohla být zjistitelná modulem runtime cíle-C, Visual Studio pro Mac použije [Register (name)] atribut pro třídu.To make the class discoverable by the Objective-C runtime, Visual Studio for Mac applies a [Register (name)] attribute to the class. I když Xamarin. iOS automaticky registruje NSObject – odvozené třídy, používá plně kvalifikované názvy .NET.Although Xamarin.iOS automatically registers NSObject-derived classes, it uses the fully qualified .NET names. Atribut použitý Visual Studio pro Mac Přepisuje chování Xamarin. iOS, aby se zajistilo, že každá třída je registrovaná s názvem použitým v souboru . xib .The attribute applied by Visual Studio for Mac overrides the Xamarin.iOS behavior to ensure each class is registered with the name used in the .xib file. Přidejte atribut ručně pro všechny vlastní třídy definované pomocí IB bez použití Visual Studio pro Mac k vygenerování souborů návrháře.Add the attribute manually for all custom classes defined using IB, without using Visual Studio for Mac to generate designer files. Díky tomu se vaše spravované třídy shodují s očekávanými názvy tříd jazyka C.Doing so makes your managed classes match up to the expected Objective-C class names.

Třídy nelze definovat ve více než jednom . xib nebo jsou v konfliktu.Classes cannot be defined in more than one .xib, or they'll conflict.

Části třídy bez návrhářeNon-Designer Class Parts

Částečné třídy návrháře nejsou určeny k použití tak, jak jsou.Designer partial classes aren't intended to be used as-is. Výstupy jsou privátní a není určena žádná základní třída.Outlets are private, and no base class is specified. Očekává se, že každá třída bude mít odpovídající část třídy "non-Designer" v jiném souboru.It's expected that each class will have a corresponding "non-designer" class part in another file. Soubor "non-Designer" nastavuje základní třídu, pracuje s nimi a definuje konstruktory, které jsou požadovány pro vytvoření instance třídy z nativního kódu.The "non-designer" file sets the base class, manipulates the outlets, and defines constructors that are required to instantiate the class from native code. Výchozí šablony . xib mají části třídy "non-Designer", ale pro jakékoli jiné vlastní třídy, které definujete v . xib, je nutné přidat nedesignerovou součást ručně.The default .xib templates have the "non-designer" class parts, but for any other custom classes you define in a .xib, you must add the non-designer part manually.

Toto rozdělení pomocí dílčích tříd je potřeba pro flexibilitu.This separation using partial classes is needed for flexibility. Například více tříd CodeBehind může podtřídit společnou spravovanou abstraktní třídu, která podtřídí třídu, která bude podtřídou v IB.For example, multiple CodeBehind classes could subclass a common managed abstract class, which subclasses the class to be subclassed by IB.

Je konvenční pro vložení tříd CodeBehind do souboru {0} . XIB.cs vedle souboru návrháře {0} . XIB.Designer.cs .It's conventional to put CodeBehind classes in a {0}.xib.cs file beside the {0}.xib.designer.cs designer file.

Vygenerované akce a odbytištěGenerated Actions and Outlets

Ve třídách částečného Návrháře Visual Studio pro Mac generuje vlastnosti odpovídající jakýmkoli připojeným výstupům definovaným v IB a částečné metody, které odpovídají jakýmkoli připojeným akcím.In the partial designer classes, Visual Studio for Mac generates properties corresponding to any connected outlets defined in IB, and partial methods corresponding to any connected actions.

Vlastnosti zásuvkyOutlet Properties

Třídy návrháře obsahují vlastnosti odpovídající všem výstupům, které jsou definovány pro vlastní třídu.Designer classes contain properties corresponding to all outlets defined on the custom class. Tyto vlastnosti umožňují opožděnou vazbu.These properties enable lazy binding. Jsou to podrobné informace o implementaci Xamarin. iOS do cílení na most C.They're an implementation detail of the Xamarin.iOS to Objective C bridge. Můžete je považovat za ekvivalentní k soukromým polím, které mají být použity pouze z třídy CodeBehind.Think of them as equivalent to private fields, intended to be used only from the CodeBehind class. Zpřístupněte pole jako veřejné přidáním veřejného přístupového objektu do pole v části třídy mimo návrháře.Make the field public by adding the public accessor to the field in the non-designer class part.

Pokud jsou vlastnosti zásuvky definovány tak, aby měly typ id (ekvivalentní NSObject ), pak generátor kódu v současné době určuje nejsilnější možný typ založený na objektech připojených k danému výstupu, a to pro usnadnění.If outlet properties are defined to have a type of id (equivalent to NSObject), then the designer code generator currently determines the strongest possible type based on objects connected to that outlet, for convenience. Toto chování se ale nemusí v budoucích verzích podporovat.However, this behavior may not be supported in future versions. Doporučuje se při definování vlastní třídy explicitně silně napsat.It's recommended that you explicitly strongly type the outlets when defining the custom class.

Vlastnosti akceAction Properties

Třídy návrháře obsahují částečné metody odpovídající všem akcím, které jsou definovány u vlastní třídy.Designer classes contain partial methods corresponding to all actions defined on the custom class. Tyto metody nemají implementaci.These methods don't have an implementation. Účelem částečných metod je dvojí:The purpose of the partial methods is twofold:

  1. Pokud zadáte partial text třídy v nenávrháři jiné třídy, Visual Studio pro Mac bude nabízet k automatickému dokončování signatur všech neimplementovaných částečných metod.If you type partial in the class body of the non-designer class part, Visual Studio for Mac will offer to autocomplete the signatures of all non-implemented partial methods.
  2. Signatury částečných metod mají atribut použit, který je zveřejňuje pro cíl-C, takže může být zpracována jako odpovídající akce.The partial method signatures have an attribute applied that exposes them to the Objective-C world, so they can get handled as the corresponding action.

Částečnou metodu můžete ignorovat a implementovat akci použitím atributu na jinou metodu.You may ignore the partial method, and implement the action by applying the attribute to a different method. Nebo nechte přejít na základní třídu.Or let it fall through to a base class.

Pokud jsou akce definovány tak, aby měly typ odesílatele id (ekvivalentní NSObject ), pak generátor kódu aktuálně určuje nejsilnější možné typy na základě objektů připojených k této akci.If actions are defined to have a sender type of id (equivalent to NSObject), then the designer code generator currently determines the strongest possible type based on objects connected to that action. Toto chování se ale nemusí v budoucích verzích podporovat.However, this behavior may not be supported in future versions. Doporučuje se explicitně silně napsat akce při definování vlastní třídy.It's recommended that you explicitly strongly type the actions when defining the custom class.

Tyto částečné metody jsou vytvořeny pouze pro jazyk C#, protože CodeDOM nepodporuje částečné metody.These partial methods are created only for C#, because CodeDOM doesn't support partial methods. Negenerují se pro jiné jazyky.They aren't generated for other languages.

Použití třídy XIBCross-XIB Class Usage

Někdy uživatelé chtějí odkazovat na stejnou třídu z více souborů . xib , například s řadiči karet.Sometimes, users wish to reference the same class from multiple .xib files, for example with tab controllers. Můžete explicitně odkazovat na definici třídy z jiného souboru . xib nebo definovat stejný název třídy znovu v druhé . xib.You can explicitly reference the class definition from another .xib file, or define the same class name again in the second .xib.

Druhý případ může být problematický kvůli Visual Studio pro Mac zpracování souborů . xib jednotlivě.The latter case can be problematic because of Visual Studio for Mac processing .xib files individually. Visual Studio pro Mac nemůže detekovat a slučovat duplicitní definice.Visual Studio for Mac can't detect and merge duplicate definitions. V případě, že je stejná částečná třída definována ve více souborech návrháře, může docházet ke konfliktům s použitím atributu Register několikrát.You may end up with conflicts applying the Register attribute multiple times when the same partial class is defined in multiple designer files. Poslední verze Visual Studio pro Mac se pokoušejí vyřešit konflikty, ale nemusí vždy fungovat podle očekávání.Recent versions of Visual Studio for Mac attempt to resolve the conflicts, but it may not always work as expected. V budoucnu se toto chování nejspíš stane nepodporovaným a místo toho Visual Studio pro Mac budou všechny typy definované ve všech souborech . xib a spravovaný kód v projektu přímo viditelné ze všech souborů . xib .In the future, this behavior is likely to become unsupported, and instead Visual Studio for Mac will make all types defined in all .xib files and managed code in the project directly visible from all .xib files.

Rozlišení typuType Resolution

Typy používané v IB jsou cílové názvy typu jazyka C namapované na typy CLR pomocí atributů registru.Types used in IB are Objective-C type names mapped to CLR types by using Register attributes. Při generování kódu Visual Studio pro Mac vyřeší typy CLR a plně kvalifikováním názvů typů pro typy cíl-C.When generating code, Visual Studio for Mac will resolve CLR types, fully qualifying the type names to the Objective-C types. Tyto typy cíl-C jsou zabaleny jádrem Xamarin. iOS Core.These Objective-C types are wrapped by the Xamarin.iOS core.

Generátor kódu v současné době nemůže v uživatelském kódu nebo knihovnách rozpoznat typy CLR z názvů typů cíl-C.The code generator can't currently resolve CLR types from Objective-C type names in user code or libraries. V takových případech vypíše název typu se zněním.In such cases, it outputs the type name verbatim. Musí mít stejný název jako typ cíl-C pro správné rozpoznání typu CLR.It must have the same name as the Objective-C type to properly resolve the CLR type. Typ CLR musí být ve stejném oboru názvů jako kód, který ho používá.The CLR Type must be in the same namespace as the code that's using it. Budoucí verze generátoru kódu budou v projektu brát v úvahu všechny typy cíl-C.Future versions of the code generator will consider all Objective-C types in the project.