Vlastní ovládací prvky v Xamarin Designeru pro iOS

Xamarin Designer pro iOS podporuje vykreslování vlastních ovládacích prvků vytvořených v projektu nebo odkazovaných z externích zdrojů, jako je úložiště komponent Xamarin.

Upozorňující

Návrhář pro iOS byl v sadě Visual Studio 2019 verze 16.8 a Visual Studio 2019 pro Mac verze 8.8 zastaralý a odebrán v sadě Visual Studio 2019 verze 16.9 a Visual Studio pro Mac verze 8.9. Doporučený způsob, jak vytvářet uživatelská rozhraní pro iOS, je přímo na Macu se systémem Xcode. Další informace naleznete v tématu Navrhování uživatelských rozhraní pomocí Xcode.

Xamarin Designer pro iOS je výkonný nástroj pro vizualizaci uživatelského rozhraní aplikace a poskytuje podporu úprav WYSIWYG pro většinu zobrazení a kontrolerů zobrazení iOS. Vaše aplikace může obsahovat také vlastní ovládací prvky, které rozšiřují ty, které jsou integrované v iOSu. Pokud jsou tyto vlastní ovládací prvky napsané s několika pokyny, můžete je také vykreslit v iOS Designeru, což poskytuje ještě bohatší prostředí pro úpravy. Tento dokument se na tyto pokyny podívá.

Požadavky

Ovládací prvek, který splňuje všechny následující požadavky, se vykreslí na návrhové ploše:

  1. Jedná se o přímou nebo nepřímou podtřídu UIView nebo UIViewController. Další podtřídy NSObject se zobrazí jako ikona na návrhové ploše.
  2. RegisterAttribute k jeho zveřejnění Objective-C.
  3. požadovaný konstruktor IntPtr.
  4. Buď implementuje IComponent rozhraní nebo má DesignTimeVisibleAttribute nastaven na True.

Ovládací prvky definované v kódu, které splňují výše uvedené požadavky, se zobrazí v návrháři, když je jejich obsahující projekt zkompilován pro simulátor. Ve výchozím nastavení se všechny vlastní ovládací prvky zobrazí v části Vlastní komponenty panelu nástrojů. Lze však použít CategoryAttribute na třídu vlastního ovládacího prvku k určení jiného oddílu.

Návrhář nepodporuje načítání knihoven třetích stran Objective-C .

Vlastní vlastnosti

Vlastnost deklarovaná vlastním ovládacím prvku se zobrazí na panelu vlastností, pokud jsou splněny následující podmínky:

  1. Vlastnost má veřejný getter a setter.
  2. Vlastnost má ExportAttribute a také BrowsableAttribute nastavena na True.
  3. Typ vlastnosti je číselný typ, typ výčtu, řetězec, bool, SizeF, UIColor nebo UIImage. Tento seznam podporovaných typů se může v budoucnu rozšířit.

Vlastnost může být také zdobena DisplayNameAttribute určit popisek, který se pro něj zobrazí na panelu vlastností.

Inicializace

Pro UIViewController podtřídy byste měli použít metodu ViewDidLoad pro kód, který závisí na zobrazeních, která jste vytvořili v návrháři.

Pro UIView a další NSObject podtřídy je metoda AwakeFromNib doporučeným místem k provedení inicializace vlastního ovládacího prvku po načtení ze souboru rozložení. Důvodem je to, že při spuštění konstruktoru ovládacího prvku se nenastaví všechny vlastní vlastnosti nastavené na panelu vlastností, ale AwakeFromNib před zavolání se nastaví:

[Register ("CustomView"), DesignTimeVisible (true)]
public class CustomView : UIView {

    public CustomView (IntPtr handle) : base (handle) { }

    public override void AwakeFromNib ()
    {
        // Initialize the view here.
    }
}

Pokud je ovládací prvek také navržený tak, aby byl vytvořen přímo z kódu, můžete vytvořit metodu, která má společný inicializační kód, například takto:

[Register ("CustomView"), DesignTimeVisible (true)]
public class CustomView : UIView {

    public CustomView (IntPtr handle) : base (handle) { }

    public CustomView ()
    {
        // Called when created from code.
        Initialize ();
    }

    public override void AwakeFromNib ()
    {
        // Called when loaded from xib or storyboard.
        Initialize ();
    }

    void Initialize ()
    {
        // Common initialization code here.
    }
}

Inicializace vlastností a vzhůruFromNib

Je třeba dbát na to, kdy a kde inicializovat designovatelné vlastnosti ve vlastní komponentě, aby nepřepsaly hodnoty, které byly nastaveny v iOS Designeru. Jako příklad použijte následující kód:

[Register ("CustomView"), DesignTimeVisible (true)]
public class CustomView : UIView {

    [Export ("Counter"), Browsable (true)]
    public int Counter {get; set;}

    public CustomView (IntPtr handle) : base (handle) { }

    public CustomView ()
    {
        // Called when created from code.
        Initialize ();
    }

    public override void AwakeFromNib ()
    {
        // Called when loaded from xib or storyboard.
        Initialize ();
    }

    void Initialize ()
    {
        // Common initialization code here.
        Counter = 0;
    }
}

Komponenta CustomViewCounter zveřejňuje vlastnost, kterou může nastavit vývojář v iOS Designeru. Bez ohledu na to, jaká hodnota je nastavena uvnitř návrháře, bude hodnota Counter vlastnosti vždy nula (0). Tady je důvod:

  • Instance objektu CustomControl je nafouknuta ze souboru Storyboard.
  • Všechny vlastnosti upravené v iOS Designeru jsou nastaveny (například nastavení hodnoty Counter na dvě (2), například).
  • Metoda AwakeFromNib se provede a volání metody komponenty Initialize .
  • Uvnitř Initialize hodnoty Counter vlastnosti se resetuje na nulu (0).

Chcete-li vyřešit výše uvedenou situaci, buď inicializovat Counter vlastnost jinde (například v konstruktoru komponenty), nebo nepřepsat metodu AwakeFromNib a volat Initialize , pokud komponenta nevyžaduje další inicializaci mimo to, co právě zpracovává jeho konstruktory.

Režim návrhu

Na návrhové ploše musí vlastní ovládací prvek dodržovat několik omezení:

  • Prostředky sady aplikací nejsou dostupné v režimu návrhu. Obrázky jsou k dispozici při načtení prostřednictvím metod UIImage .
  • Asynchronní operace, jako jsou webové požadavky, by se neměly provádět v režimu návrhu. Návrhová plocha nepodporuje animaci ani jiné asynchronní aktualizace uživatelského rozhraní ovládacího prvku.

Vlastní ovládací prvek může implementovat IComponent a pomocí Vlastnosti DesignMode zkontrolovat, zda je na návrhové ploše. V tomto příkladu se v popisku na návrhové ploše zobrazí režim návrhu a modul runtime za běhu:

[Register ("DesignerAwareLabel")]
public class DesignerAwareLabel : UILabel, IComponent {

    #region IComponent implementation

    public ISite Site { get; set; }
    public event EventHandler Disposed;

    #endregion

    public DesignerAwareLabel (IntPtr handle) : base (handle) { }

    public override void AwakeFromNib ()
    {
        if (Site != null && Site.DesignMode)
            Text = "Design Mode";
        else
            Text = "Runtime";
    }
}

Před pokusem o přístup k některému z jejích členů byste měli vždy zkontrolovat Site vlastnost null . Pokud Site ano null, je bezpečné předpokládat, že ovládací prvek není spuštěný v návrháři. V režimu Site návrhu bude nastaven po spuštění konstruktoru ovládacího prvku a před AwakeFromNib zavolání.

Ladění

Ovládací prvek, který splňuje výše uvedené požadavky, se zobrazí v sadě nástrojů a zobrazí se na povrchu. Pokud se ovládací prvek nevykreslí, zkontrolujte chyby v ovládacím prvku nebo některé z jejích závislostí.

Návrhová plocha může často zachytit výjimky vyvolané jednotlivými ovládacími prvky a zároveň pokračovat v vykreslování jiných ovládacích prvků. Vadný ovládací prvek se nahradí červeným zástupným symbolem a můžete zobrazit trasování výjimky kliknutím na ikonu vykřičníku:

A faulty control as red placeholder and the exception details

Pokud jsou pro ovládací prvek k dispozici symboly ladění, bude trasování obsahovat názvy souborů a čísla řádků. Poklikáním na řádek v trasování zásobníku přejdete na tento řádek ve zdrojovém kódu.

Pokud návrhář nemůže izolovat vadný ovládací prvek, zobrazí se v horní části návrhové plochy upozornění:

A warning message at the top of the design surface

Úplné vykreslování se obnoví, když je vadný ovládací prvek opravený nebo odebraný z návrhové plochy.

Shrnutí

Tento článek představil vytvoření a použití vlastních ovládacích prvků v iOS Designeru. Nejprve jsme popsali požadavky, které musí ovládací prvky splňovat, aby se vykreslovaly na návrhové ploše a zobrazovaly vlastní vlastnosti na panelu vlastností. Pak se podíval na kód za - inicializace ovládacího prvku a DesignMode vlastnost. Nakonec jsme popsali, co se stane, když dojde k vyvolání výjimek a jak to vyřešit.