Kontrolki niestandardowe w Projektant platformy Xamarin dla systemu iOS

Zestaw Projektant Xamarin dla systemu iOS obsługuje renderowanie kontrolek niestandardowych utworzonych w projekcie lub przywoływały się z zewnętrznych źródeł, takich jak magazyn składników Xamarin.

Ostrzeżenie

Projektant systemu iOS zostały wycofane w programie Visual Studio 2019 w wersji 16.8 i Visual Studio 2019 dla komputerów Mac w wersji 8.8 i usunięte w programie Visual Studio 2019 w wersji 16.9 i Visual Studio dla komputerów Mac w wersji 8.9. Zalecanym sposobem kompilowania interfejsów użytkownika systemu iOS jest bezpośrednio na komputerze Mac z uruchomionym programem Xcode. Aby uzyskać więcej informacji, zobacz Projektowanie interfejsów użytkownika za pomocą programu Xcode.

Platforma Xamarin Projektant dla systemu iOS to zaawansowane narzędzie do wizualizowania interfejsu użytkownika aplikacji i zapewnia obsługę edycji WYSIWYG dla większości widoków i kontrolerów widoków systemu iOS. Aplikacja może również zawierać kontrolki niestandardowe, które rozszerzają te wbudowane w system iOS. Jeśli te kontrolki niestandardowe są napisane z kilkoma wytycznymi, mogą być również renderowane przez Projektant systemu iOS, zapewniając jeszcze bardziej rozbudowane środowisko edycji. Ten dokument zawiera informacje na temat tych wytycznych.

Wymagania

Kontrolka spełniająca wszystkie następujące wymagania zostanie wyrenderowana na powierzchni projektowej:

  1. Jest to bezpośredni lub pośredni podklasa UIView lub UIViewController. Inne podklasy NSObject będą wyświetlane jako ikona na powierzchni projektowej.
  2. Ma on atrybut RegisterAttribute , aby uwidocznić go w pliku Objective-C.
  3. Ma on wymagany konstruktor IntPtr.
  4. Implementuje interfejs IComponent lub ma właściwość DesignTimeVisibleAttribute ustawioną na true.

Kontrolki zdefiniowane w kodzie, które spełniają powyższe wymagania, będą wyświetlane w projektancie podczas kompilowania ich zawierającego projekt dla symulatora. Domyślnie wszystkie kontrolki niestandardowe będą wyświetlane w sekcji Składniki niestandardowe przybornika. Jednak atrybut CategoryAttribute można zastosować do klasy kontrolki niestandardowej w celu określenia innej sekcji.

Projektant nie obsługuje ładowania bibliotek innych firm Objective-C .

Właściwości niestandardowe

Właściwość zadeklarowana przez kontrolkę niestandardową pojawi się w panelu właściwości, jeśli spełnione są następujące warunki:

  1. Właściwość ma publiczny moduł pobierania i ustawiania.
  2. Właściwość ma atrybut ExportAttribute , a także element BrowsableAttribute ustawiony na wartość True.
  3. Typ właściwości to typ liczbowy, typ wyliczenia, ciąg, bool, SizeF, UIColor lub UIImage. Ta lista obsługiwanych typów może zostać rozszerzona w przyszłości.

Właściwość może być również ozdobiona atrybutem DisplayNameAttribute , aby określić etykietę wyświetlaną dla niej w panelu właściwości.

Inicjowanie

W przypadku UIViewController podklas należy użyć metody ViewDidLoad dla kodu, który zależy od widoków utworzonych w projektancie.

W przypadku UIView i innych NSObject podklas metoda AwakeFromNib jest zalecanym miejscem do inicjowania kontrolki niestandardowej po załadowaniu jej z pliku układu. Dzieje się tak, ponieważ wszystkie właściwości niestandardowe ustawione w panelu właściwości nie zostaną ustawione podczas uruchamiania konstruktora kontrolki, ale zostaną ustawione przed AwakeFromNib wywołaniami:

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

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

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

Jeśli kontrolka została również zaprojektowana do utworzenia bezpośrednio na podstawie kodu, możesz utworzyć metodę, która ma wspólny kod inicjowania, w następujący sposób:

[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.
    }
}

Inicjowanie właściwości i AwakeFromNib

Należy zachować ostrożność, kiedy i gdzie zainicjować właściwości możliwe do zaprojektowania w składniku niestandardowym, aby nie zastępować wartości, które zostały ustawione wewnątrz Projektant systemu iOS. Na przykład weź następujący kod:

[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;
    }
}

Składnik CustomView uwidacznia Counter właściwość, którą może ustawić deweloper w Projektant systemu iOS. Jednak niezależnie od tego, jaka wartość jest ustawiona wewnątrz projektanta, wartość Counter właściwości będzie zawsze równa zero (0). Poniżej przedstawiono przyczyny:

  • Wystąpienie obiektu CustomControl jest zawyżone z pliku Storyboard.
  • Wszystkie właściwości zmodyfikowane w projektancie systemu iOS są ustawione (na przykład ustawienie wartości Counter na dwie (2).
  • Metoda AwakeFromNib jest wykonywana, a wywołanie jest wykonywane do metody składnika Initialize .
  • Wewnątrz Initialize wartości Counter właściwości jest resetowany do zera (0).

Aby rozwiązać powyższy problem, zainicjuj Counter właściwość w innym miejscu (na przykład w konstruktorze składnika) lub nie przesłaniaj AwakeFromNib metody i wywołaj Initialize metodę, jeśli składnik nie wymaga dalszej inicjalizacji poza tym, co jest obecnie obsługiwane przez jego konstruktory.

Tryb projektowania

Na powierzchni projektowej kontrolka niestandardowa musi być zgodna z kilkoma ograniczeniami:

  • Zasoby pakietu aplikacji nie są dostępne w trybie projektowania. Obrazy są dostępne podczas ładowania za pomocą metod UIImage.
  • Operacje asynchroniczne, takie jak żądania internetowe, nie powinny być wykonywane w trybie projektowania. Powierzchnia projektowa nie obsługuje animacji ani żadnych innych aktualizacji asynchronicznych interfejsu użytkownika kontrolki.

Kontrolka niestandardowa może zaimplementować element IComponent i użyć właściwości DesignMode , aby sprawdzić, czy znajduje się na powierzchni projektowej. W tym przykładzie etykieta będzie wyświetlać "Tryb projektowania" na powierzchni projektowej i "Środowisko uruchomieniowe" w czasie wykonywania:

[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";
    }
}

Przed próbą Site uzyskania dostępu do dowolnego z jego elementów członkowskich należy zawsze sprawdzić właściwość null . Jeśli Site jest nullto , można bezpiecznie założyć, że kontrolka nie jest uruchomiona w projektancie. W trybie Site projektowania zostanie ustawiona po uruchomieniu konstruktora kontrolki i przed AwakeFromNib wywołaniami.

Debugowanie

Kontrolka spełniająca powyższe wymagania będzie wyświetlana w przyborniku i renderowana na powierzchni. Jeśli kontrolka nie jest renderowana, sprawdź błędy w kontrolce lub jedną z jej zależności.

Powierzchnia projektowa często może przechwytywać wyjątki zgłaszane przez poszczególne kontrolki, a jednocześnie renderować inne kontrolki. Uszkodzony formant jest zastępowany czerwonym symbolem zastępczym i można wyświetlić ślad wyjątku, klikając ikonę wykrzyknika:

A faulty control as red placeholder and the exception details

Jeśli symbole debugowania są dostępne dla kontrolki, ślad będzie miał nazwy plików i numery wierszy. Dwukrotne kliknięcie wiersza w śladzie stosu spowoduje przejście do tego wiersza w kodzie źródłowym.

Jeśli projektant nie może odizolować uszkodzonej kontrolki, w górnej części powierzchni projektowej pojawi się komunikat ostrzegawczy:

A warning message at the top of the design surface

Pełne renderowanie zostanie wznowione po naprawieniu lub usunięciu uszkodzonej kontrolki z powierzchni projektowej.

Podsumowanie

W tym artykule przedstawiono tworzenie i stosowanie kontrolek niestandardowych w projektancie systemu iOS. Najpierw opisano wymagania, które muszą spełniać kontrolki, które muszą być renderowane na powierzchni projektowej i uwidaczniać właściwości niestandardowe w panelu właściwości. Następnie przyjrzeł się kodowi z tyłu — inicjalizacji kontrolki i właściwości DesignMode. Na koniec opisano, co się stanie, gdy wyjątki są zgłaszane i jak rozwiązać ten problem.