Opakované použití stránek Xamarin.Forms v rozšíření pro iOS
Rozšíření pro iOS umožňují přizpůsobit stávající chování systému přidáním dalších funkcí předdefinovaných body rozšíření pro iOS a macOS, jako jsou vlastní kontextové akce, automatické vyplňování hesla, filtry příchozích volání, modifikátory obsahu oznámení a další. Xamarin.iOS podporuje rozšíření a tento průvodce vás provede vytvořením rozšíření pro iOS pomocí nástrojů Xamarin.
Rozšíření se distribuují jako součást aplikace kontejneru a aktivují se z konkrétního bodu rozšíření v hostitelské aplikaci. Kontejnerová aplikace je obvykle jednoduchá aplikace pro iOS, která poskytuje uživateli informace o rozšíření, o tom, jak ho aktivovat a používat. Existují tři hlavní přístupy ke sdílení kódu mezi rozšířením a kontejnerovou aplikací:
Běžný projekt pro iOS
Veškerý sdílený kód můžete vložit mezi kontejner a rozšíření do sdílené knihovny pro iOS a odkazovat na knihovnu z obou projektů. Sdílená knihovna obvykle obsahuje nativní UIViewControllers a musí to být knihovna Xamarin.iOS.
Odkazy na soubory.
V některých případech aplikace Kontejner poskytuje většinu funkcí, zatímco rozšíření potřebuje vykreslit jeden
UIViewController
. S několika soubory, které chcete sdílet, je běžné přidat odkaz na soubor aplikace Extension ze souboru umístěného v aplikaci Kontejner.Společný projekt Xamarin.Forms
Pokud už jsou stránky aplikací sdíleny s jinou platformou, například s Androidem, pomocí rozhraní Xamarin.Forms, je běžný přístup k opětovnému sestavení požadovaných stránek nativně v projektu rozšíření, protože rozšíření pro iOS funguje s nativními uiViewControllers a nikoli stránkami Xamarin.Forms. Musíte provést další kroky pro použití Xamarin.Forms v rozšíření pro iOS, které jsou vysvětleny níže.
Xamarin.Forms v projektu rozšíření pro iOS
Možnost používat Xamarin.Forms v nativním projektu je poskytována prostřednictvím nativních formulářů. ContentPage
Umožňuje přímé přidání odvozených stránek do nativních projektů Xamarin.iOS. Metoda CreateViewController
rozšíření převede instanci stránky Xamarin.Forms na nativní UIViewController
, který lze použít nebo upravit jako běžný kontroler. Vzhledem k tomu, že rozšíření pro iOS je speciální druh nativního projektu pro iOS, můžete zde také použít nativní formuláře .
Důležité
Rozšíření pro iOS mají mnoho známých omezení . I když v rozšíření pro iOS můžete použít Xamarin.Forms, měli byste to udělat velmi pečlivě, monitorovat využití paměti a čas spuštění. Jinak by rozšíření mohlo být ukončeno iOSem bez jakéhokoliv způsobu, jak to řádně zpracovat.
Názorný postup
V tomto názorném postupu vytvoříte aplikaci Xamarin.Forms, rozšíření Xamarin.iOS a znovu použijete sdílený kód v projektu rozšíření:
Otevřete Visual Studio pro Mac, vytvořte nový projekt Xamarin.Forms pomocí šablony Prázdná aplikace Forms a pojmenujte ho FormsShareExtension:
V souboru FormsShareExtension/MainPage.xaml nahraďte obsah následujícím rozložením:
<?xml version="1.0" encoding="utf-8" ?> <ContentPage x:Class="FormsShareExtension.MainPage" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:d="http://xamarin.com/schemas/2014/forms/design" xmlns:local="clr-namespace:FormsShareExtension" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:DataType="local:MainPageViewModel" BackgroundColor="Orange" mc:Ignorable="d"> <ContentPage.BindingContext> <local:MainPageViewModel Message="Hello from Xamarin.Forms!" /> </ContentPage.BindingContext> <StackLayout HorizontalOptions="Center" VerticalOptions="Center"> <Label Margin="20" Text="{Binding Message}" VerticalOptions="CenterAndExpand" /> <Button Command="{Binding DoCommand}" Text="Do the job!" /> </StackLayout> </ContentPage>
Přidejte novou třídu s názvem MainPageViewMode do projektu FormsShareExtension a nahraďte obsah třídy následujícím kódem:
using System; using System.ComponentModel; using System.Windows.Input; using Xamarin.Forms; namespace FormsShareExtension { public class MainPageViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private string _message; public string Message { get { return _message; } set { if (_message != value) { _message = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Message))); } } } private ICommand _doCommand; public ICommand DoCommand { get { return _doCommand; } set { if(_doCommand != value) { _doCommand = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DoCommand))); } } } public MainPageViewModel() { DoCommand = new Command(OnDoCommandExecuted); } private void OnDoCommandExecuted(object state) { Message = $"Job {Environment.TickCount} has been completed!"; } } }
Kód se sdílí na všech platformách a bude ho také používat rozšíření pro iOS.
V oblasti řešení klikněte pravým tlačítkem na řešení, vyberte Přidat rozšíření akce rozšíření > projektu > pro iOS>, pojmenujte ho MyAction a stiskněte Vytvořit:>
Pokud chcete použít Xamarin.Forms v rozšíření pro iOS a sdílený kód, musíte přidat požadované odkazy:
Klikněte pravým tlačítkem myši na rozšíření pro iOS, vyberte Reference > Add Reference > Projects > FormsShareExtension a stiskněte OK.
Klikněte pravým tlačítkem na rozšíření pro iOS, vyberte Balíčky Spravovat balíčky > NuGet... > Xamarin.Forms a stiskněte Přidat balíček.
Rozbalte projekt rozšíření a upravte vstupní bod tak, aby inicializoval Xamarin.Forms a vytvořil stránky. Podle požadavků na iOS musí rozšíření definovat vstupní bod v souboru Info.plist jako
NSExtensionMainStoryboard
neboNSExtensionPrincipalClass
. Po aktivaci vstupního bodu můžete v tomto případěActionViewController.ViewDidLoad
vytvořit instanci stránky Xamarin.Forms a zobrazit ji uživateli. Proto otevřete vstupní bod a nahraďte metoduViewDidLoad
následující implementací:public override void ViewDidLoad() { base.ViewDidLoad(); // Initialize Xamarin.Forms framework global::Xamarin.Forms.Forms.Init(); // Create an instance of XF page with associated View Model var xfPage = new MainPage(); var viewModel = (MainPageViewModel)xfPage.BindingContext; viewModel.Message = "Welcome to XF Page created from an iOS Extension"; // Override the behavior to complete the execution of the Extension when a user press the button viewModel.DoCommand = new Command(() => DoneClicked(this)); // Convert XF page to a native UIViewController which can be consumed by the iOS Extension var newController = xfPage.CreateViewController(); // Present new view controller as a regular view controller this.PresentModalViewController(newController, false); }
Vytvoří
MainPage
instanci pomocí standardního konstruktoru a před použitím v rozšíření ji převeďte na nativníUIViewController
metoduCreateViewController
rozšíření.Sestavte a spusťte aplikaci:
Rozšíření aktivujete tak, že přejdete do prohlížeče Safari, zadáte libovolnou webovou adresu, například microsoft.com, stisknete klávesu Navigate a v dolní části stránky stisknete ikonu Sdílet , abyste viděli dostupná rozšíření akcí. V seznamu dostupných rozšíření vyberte rozšíření MyAction klepnutím na něj:
Rozšíření se aktivuje a uživateli se zobrazí stránka Xamarin.Forms. Všechny vazby a příkazy fungují jako v aplikaci Kontejner.
Původní kontroler zobrazení vstupního bodu je viditelný, protože je vytvořen a aktivován systémem iOS. Pokud chcete tento problém vyřešit, změňte modální styl prezentace na
UIModalPresentationStyle.FullScreen
nový kontroler přidáním následujícího kódu přímo předPresentModalViewController
volání:newController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen;
Sestavte a spusťte v simulátoru iOS nebo zařízení:
Důležité
Pro sestavení zařízení se ujistěte, že používáte správná nastavení sestavení a konfiguraci vydané verze , jak je popsáno zde.