Práce se scénáři v Xamarin.Mac

Scénář definuje veškeré uživatelské rozhraní pro danou aplikaci rozdělené do funkčního přehledu kontrolerů zobrazení. V Tvůrci rozhraní Xcode každý z těchto kontrolerů žije ve své vlastní scéně.

A storyboard in Xcode's Interface Builder

Storyboard je soubor prostředků (s příponami .storyboard), který se při kompilaci a odeslání zahrne do sady aplikace Xamarin.Mac. Pokud chcete definovat počáteční scénář pro vaši aplikaci, upravte ho Info.plist a v rozevíracím seznamu vyberte Hlavní rozhraní :

The Info.plist editor

Načítání z kódu

Někdy může docházet k tomu, že potřebujete načíst konkrétní scénář z kódu a vytvořit kontroler zobrazení ručně. K provedení této akce můžete použít následující kód:

// Get new window
var storyboard = NSStoryboard.FromName ("Main", null);
var controller = storyboard.InstantiateControllerWithIdentifier ("MainWindow") as NSWindowController;

// Display
controller.ShowWindow(this);

Načte FromName soubor Storyboard se zadaným názvem, který je součástí sady aplikací. Vytvoří InstantiateControllerWithIdentifier instanci kontroleru zobrazení s danou identitou. Identitu nastavíte v Tvůrci rozhraní Xcode při návrhu uživatelského rozhraní:

Setting the Storyboard ID in Interface Builder.

Volitelně můžete použít metodu InstantiateInitialController k načtení kontroleru zobrazení, který byl přiřazen počáteční kontroler v Tvůrci rozhraní:

Setting the initial controller

Je označen vstupním bodem storyboardu a otevřenou šipkou ukončenou nad ní.

Zobrazit kontrolery

Kontrolery zobrazení definují vztahy mezi daným zobrazením informací v aplikaci pro Mac a datovým modelem, který poskytuje příslušné informace. Každá scéna nejvyšší úrovně ve storyboardu představuje jeden kontroler zobrazení v kódu aplikace Xamarin.Mac.

Životní cyklus kontroleru zobrazení

Do NSViewController třídy bylo přidáno několik nových metod, které podporují scénáře v macOS. Nejdůležitější jsou následující metody, které slouží k reakci na životní cyklus zobrazení řízeného daným kontrolerem zobrazení:

  • ViewDidLoad - Tato metoda je volána při načtení zobrazení ze souboru Storyboard.
  • ViewWillAppear - Tato metoda se volá těsně před zobrazením na obrazovce.
  • ViewDidAppear - Tato metoda se volá přímo po zobrazení na obrazovce.
  • ViewWillDisappear - Tato metoda se volá těsně před odebráním zobrazení z obrazovky.
  • ViewDidDisappear - Tato metoda se volá přímo po odebrání zobrazení z obrazovky.
  • UpdateViewConstraints – Tato metoda se volá, když je potřeba aktualizovat omezení, která definují umístění a velikost zobrazení automatického rozložení.
  • ViewWillLayout - Tato metoda se nazývá těsně před zobrazením tohoto zobrazení jsou rozloženy na obrazovce.
  • ViewDidLayout - Tato metoda je volána přímo po zobrazení zobrazení jsou rozloženy na obrazovce.

Řetězec respondéru

Kromě toho NSViewControllers jsou teď součástí řetězce respondéru okna:

The Responder Chain

A jako takové jsou připojeny k příjmu a odpovídání na události, jako jsou výběry položek nabídky Vyjmout, Kopírovat a Vložit. K tomuto automatickému připojení kontroleru zobrazení dochází pouze u aplikací spuštěných v systému macOS Sierra (10.12) a novějších.

Uzavření

Ve scénářích teď můžou kontrolery zobrazení (například rozdělit kontroler zobrazení a kontroler zobrazení karet) implementovat zahrnutí, aby mohly obsahovat další dílčí kontrolery zobrazení:

An example of View Controller Containment

Podřízené kontrolery zobrazení obsahují metody a vlastnosti, které je provázají zpět s nadřazeným kontrolerem zobrazení a pracují se zobrazením a odebráním zobrazení z obrazovky.

Všechny kontrolery zobrazení kontejnerů integrované v systému macOS mají specifické rozložení, které Apple doporučuje, abyste postupovali, pokud vytváříte vlastní kontrolery zobrazení kontejnerů:

The View Controller layout

Kontroler zobrazení kolekce obsahuje pole položek zobrazení kolekce, z nichž každá obsahuje jeden nebo více kontrolerů zobrazení, které obsahují vlastní zobrazení.

Segues

Segues poskytuje vztahy mezi všemi scénami, které definují uživatelské rozhraní vaší aplikace. Pokud znáte práci ve scénářích v iOSu, víte, že segues pro iOS obvykle definují přechody mezi zobrazeními na celé obrazovce. To se liší od macOS, když Segues obvykle definuje "Zahrnutí", kde jedna scéna je podřízená nadřazené scéně.

V systému macOS většina aplikací obvykle seskupuje svá zobrazení do stejného okna pomocí prvků uživatelského rozhraní, jako jsou rozdělení zobrazení a tabulátory. Na rozdíl od iOSu, kde je potřeba přecházet na i mimo obrazovku, kvůli omezenému fyzickému prostoru pro zobrazení.

Prezentační segues

Vzhledem k tomu, že macOS má tendenci k blokování, existují situace, kdy se používají prezentační segues , jako jsou modální okna, zobrazení listů a překryvná okna. macOS poskytuje následující předdefinované typy segue:

  • Show - Zobrazí cíl segue jako nemodální okno. Tento typ Segue můžete například použít k prezentaci jiné instance okna dokumentu ve vaší aplikaci.
  • Modální - Představuje cíl Segue jako modální okno. Pomocí tohoto typu segue můžete například prezentovat okno Předvoleb pro vaši aplikaci.
  • List – představuje cíl segue jako list připojený k nadřazeným oknem. Pomocí tohoto typu segue můžete například prezentovat list Najít a nahradit.
  • Popover - Prezentuje cíl Segue jako v automaticky otevírané okno. Pomocí tohoto typu Segue můžete například prezentovat možnosti, když uživatel klikne na prvek uživatelského rozhraní.
  • Vlastní – představuje cíl segue pomocí vlastního typu Segue definovaného vývojářem. Další podrobnosti najdete v části Vytváření vlastních segues níže.

Při použití prezentační segues můžete přepsat PrepareForSegue metodu nadřazeného kontroleru zobrazení pro prezentaci, aby inicializovala a proměnné a poskytla všechna data kontroleru zobrazení, který se prezentuje.

Aktivované segues

Triggered Segues umožňuje zadat pojmenované Segues (prostřednictvím vlastnosti Identifikátor v Interface Builderu) a nechat je aktivovat událostmi, jako je uživatel, který klikne na tlačítko nebo zavolá metodu PerformSegue v kódu:

// Display the Scene defined by the given Segue ID
PerformSegue("MyNamedSegue", this);

Id Segue se definuje uvnitř Tvůrce rozhraní Xcode při rozložení uživatelského rozhraní aplikace:

Entering a Segue Name

V zobrazení kontroleru, který funguje jako zdroj Segue, byste měli přepsat PrepareForSegue metodu a provést jakékoli inicializace požadované před spuštěním Segue a zadaný kontroler zobrazení se zobrazí:

public override void PrepareForSegue (NSStoryboardSegue segue, NSObject sender)
{
    base.PrepareForSegue (segue, sender);

    // Take action based on Segue ID
    switch (segue.Identifier) {
    case "MyNamedSegue":
        // Prepare for the segue to happen
        ...
        break;
    }
}

Volitelně můžete přepsat metodu ShouldPerformSegue a řídit, zda se Segue skutečně provádí prostřednictvím kódu jazyka C#. U ručně prezentovaných kontrolerů zobrazení zavolejte metodu DismissController , která je odebere ze zobrazení, když už nejsou potřeba.

Vytváření vlastních segues

Někdy může docházet k tomu, že vaše aplikace vyžaduje typ Segue, který není poskytovaný buildem Segues definovaným v systému macOS. V takovém případě můžete vytvořit vlastní segue, který se dá přiřadit v Tvůrci rozhraní Xcode při rozložení uživatelského rozhraní vaší aplikace.

Pokud například chcete vytvořit nový typ Segue, který nahradí aktuální kontroler zobrazení uvnitř okna (místo otevření cílové scény v novém okně), můžeme použít následující kód:

using System;
using AppKit;
using Foundation;

namespace OnCardMac
{
    [Register("ReplaceViewSeque")]
    public class ReplaceViewSeque : NSStoryboardSegue
    {
        #region Constructors
        public ReplaceViewSeque() {

        }

        public ReplaceViewSeque (string identifier, NSObject sourceController, NSObject destinationController) : base(identifier,sourceController,destinationController) {

        }

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

        public ReplaceViewSeque (NSObjectFlag x) : base(x) {
        }
        #endregion

        #region Override Methods
        public override void Perform ()
        {
            // Cast the source and destination controllers
            var source = SourceController as NSViewController;
            var destination = DestinationController as NSViewController;

            // Swap the controllers
            source.View.Window.ContentViewController = destination;

            // Release memory
            source.RemoveFromParentViewController ();
        }
        #endregion

    }
        
}

Tady je pár věcí, které je potřeba poznamenat:

  • K zveřejnění této třídy Objective-Cpro /macOS používáme Register atribut.
  • Přepíšeme metodu Perform , abychom skutečně provedli akci vlastní segue.
  • Kontroler okna ContentViewController nahrazujeme kontrolerem definovaným cílem (cílem) segue.
  • Odebíráme původní kontroler zobrazení, aby se uvolnila paměť pomocí RemoveFromParentViewController metody.

Abychom mohli použít tento nový typ Segue v Tvůrci rozhraní Xcode, musíme nejprve zkompilovat aplikaci, pak přepnout na Xcode a přidat nový Segue mezi dvě scény. Nastavte styl na vlastní a třídu Segue na ReplaceViewSegue (název naší vlastní třídy Segue):

Setting the Segue class

Kontrolery oken

Kontrolery oken obsahují a řídí různé typy oken, které může aplikace pro macOS vytvořit. Pro scénáře mají následující funkce:

  1. Musí poskytnout kontroler zobrazení obsahu. Bude to stejný kontroler zobrazení obsahu, který má podřízené okno.
  2. Vlastnost Storyboard bude obsahovat storyboard, ze kterého byl načten kontroler oken, jinak null pokud není načten z storyboardu.
  3. Metodu můžete volat, DismissController abyste zavřeli dané okno a odebrali ho ze zobrazení.

Podobně jako kontrolery zobrazení implementují PerformSeguePrepareForSegue kontrolery oken a ShouldPerformSegue metody a lze je použít jako zdroj operace Segue.

Správce oken zodpovídá za následující funkce aplikace pro macOS:

  • Spravují konkrétní okno.
  • Spravují záhlaví a panel nástrojů okna (pokud jsou k dispozici).
  • Spravují kontroler zobrazení obsahu, aby zobrazily obsah okna.

Rozpoznávání gest

Rozpoznávání gest pro macOS je téměř stejné jako jejich protějšky v iOSu a umožňuje vývojářům snadno přidávat gesta (například kliknutí na tlačítko myši) k prvkům v uživatelském rozhraní vaší aplikace.

Pokud jsou však gesta v iOSu určena návrhem aplikace (například klepnutím na obrazovku dvěma prsty), většina gest v systému macOS je určena hardwarem.

Pomocí rozpoznávání gest můžete výrazně snížit množství kódu potřebného k přidání vlastních interakcí do položky v uživatelském rozhraní. Jak mohou automaticky určit mezi dvojitým a jedním kliknutím, klikněte a přetáhněte události atd.

Místo přepsání MouseDown události v kontroleru zobrazení byste při práci se scénáři měli použít rozpoznávání gest ke zpracování události vstupu uživatele.

V systému macOS jsou k dispozici následující nástroje pro rozpoznávání gest:

  • NSClickGestureRecognizer - Zaregistrujte události myši dolů a nahoru.
  • NSPanGestureRecognizer - Zaregistruje tlačítko myši dolů, přetáhněte a uvolněte události.
  • NSPressGestureRecognizer - Zaregistruje se podržení tlačítka myši na danou dobu.
  • NSMagnificationGestureRecognizer - Zaregistruje událost zvětšení z hardwaru trackpadu.
  • NSRotationGestureRecognizer - Zaregistruje událost rotace z hardwaru trackpadu.

Použití odkazů na storyboard

Referenční informace ke storyboardu vám umožní vzít velký, složitý návrh scénáře a rozdělit ho na menší scénáře, na které se odkazuje z původního textu, a tím usnadnit návrh a údržbu výsledných jednotlivých scénářů.

Kromě toho může odkaz na storyboard poskytnout ukotvení k jiné scéně v rámci stejné scénáře nebo konkrétní scény na jiném místě.

Odkazování na externí scénář

Pokud chcete přidat odkaz na externí storyboard, postupujte takto:

  1. V Průzkumník řešení klikněte pravým tlačítkem na název projektu a vyberte Přidat>nový soubor...>>Mac Storyboard. Zadejte název nové scénáře a klikněte na tlačítko Nový:

    Adding a new Storyboard

  2. V Průzkumník řešení poklikejte na nový název scénáře a otevřete ho pro úpravy v Tvůrci rozhraní Xcode.

  3. Navrhněte rozložení scén nové storyboardu tak, jak byste normálně chtěli, a uložte změny:

    Designing the interface

  4. Přepněte na storyboard, do kterého budete přidávat odkaz v Tvůrci rozhraní.

  5. Přetáhněte odkaz na storyboard z knihovny objektů na návrhovou plochu:

    Selecting a Storyboard Reference in the Library

  6. V inspektoru atributů vyberte název scénáře, který jste vytvořili výše:

    Configuring the reference

  7. Control-click on a UI Widget (like a Button) on an existing Scene and create a new Segue to the Storyboard Reference , kterou jste právě vytvořili. V místní nabídce vyberte Zobrazit , abyste dokončili segue:

    Setting the Segue type

  8. Uložte změny do scénáře.

  9. Vraťte se do Visual Studio pro Mac, abyste synchronizovali změny.

Když se aplikace spustí a uživatel klikne na prvek uživatelského rozhraní, ze kterého jste vytvořili Segue, zobrazí se počáteční kontroler okna z externího scénáře určeného v odkazu na scénář.

Odkazování na konkrétní scénu v externí scénáře

Pokud chcete přidat odkaz na konkrétní scénu, externí scénář (nikoli počáteční kontroler okna), postupujte takto:

  1. V Průzkumník řešení poklikáním otevřete externí storyboard pro úpravy v Tvůrci rozhraní Xcode.

  2. Přidejte novou scénu a vytvořte její rozložení tak, jak byste normálně chtěli:

    Designing the layout in Xcode

  3. V nástroji Identity Inspector zadejte ID scénáře pro kontroler oken nové scény:

    Setting the Storyboard I D to AltScene under Identity.

  4. Otevřete storyboard, do kterého budete přidávat odkaz v Tvůrci rozhraní.

  5. Přetáhněte odkaz na storyboard z knihovny objektů na návrhovou plochu:

    Selecting a Storyboard Reference from the Library

  6. V nástroji Identity Inspector vyberte název scénáře a ID reference (ID scénáře) scény, kterou jste vytvořili výše:

    Setting the Reference I D to AltScene under Storyboard Reference.

  7. Control-click on a UI Widget (like a Button) on an existing Scene and create a new Segue to the Storyboard Reference , kterou jste právě vytvořili. V místní nabídce vyberte Zobrazit , abyste dokončili segue:

    Setting the Segue Type

  8. Uložte změny do scénáře.

  9. Vraťte se do Visual Studio pro Mac, abyste synchronizovali změny.

Když se aplikace spustí a uživatel klikne na prvek uživatelského rozhraní, ze kterého jste vytvořili Segue, zobrazí se scéna s daným ID scénáře z externího scénáře zadaného v odkazu na scénář.

Odkazování na konkrétní scénu ve stejné scénáři

Pokud chcete přidat odkaz na konkrétní scénu, která má stejnou scénář, postupujte takto:

  1. V Průzkumník řešení poklikáním otevřete storyboard pro úpravy.

  2. Přidejte novou scénu a vytvořte její rozložení tak, jak byste normálně chtěli:

    Editing the storyboard in Xcode

  3. V nástroji Identity Inspector zadejte ID scénáře pro kontroler oken nové scény:

    Setting the Storyboard I D to IntScene under Identity.

  4. Přetáhněte odkaz na storyboard z panelu nástrojů na návrhovou plochu:

    Selecting a Storyboard Reference from the Library

  5. V inspektoru atributů vyberte REFERENČNÍ ID (ID scénáře) scény, kterou jste vytvořili výše:

    Setting the Reference I D to IntScene under Storyboard Reference.

  6. Control-click on a UI Widget (like a Button) on an existing Scene and create a new Segue to the Storyboard Reference , kterou jste právě vytvořili. V místní nabídce vyberte Zobrazit , abyste dokončili segue:

    Selecting the Segue Type

  7. Uložte změny do scénáře.

  8. Vraťte se do Visual Studio pro Mac, abyste synchronizovali změny.

Když se aplikace spustí a uživatel klikne na prvek uživatelského rozhraní, ze kterého jste vytvořili Segue, zobrazí se scéna s daným ID scénáře ve stejné storyboardu zadaném v odkazu na storyboard.

Příklad komplexního scénáře

Složitý příklad práce se scénáři v aplikaci Xamarin.Mac najdete v ukázkové aplikaci SourceWriter. SourceWriter je jednoduchý editor zdrojového kódu, který poskytuje podporu pro dokončování kódu a jednoduché zvýrazňování syntaxe.

Zdrojový kód byl plně okomentován a pokud je k dispozici, odkazy byly poskytovány z klíčových technologií nebo metod relevantních informací v dokumentaci průvodců Xamarin.Mac.