Как сослаться на класс из проекта iOS на основной проект в xamarin - PullRequest
0 голосов
/ 22 ноября 2018

Я создаю приложение, в котором вход будет обрабатываться с использованием auth0.Но из-за доступных пакетов Auth0 NuGet мне пришлось создавать отдельные страницы входа в систему для Android и iOS.Так что в классе app.xaml.cs мне теперь нужно ссылаться на Login_iOS для case Device.iOS: MainPage = new Login_iOS⁩();, но я столкнулся с ошибкой, так как xamarin не может найти класс Login_iOS.Я уверен, что это потому, что я не ссылался на него правильно, и я не могу найти способ ссылаться на него правильно.Скриншоты ниже должны помочь мне объяснить мою ситуацию.

App.xaml.csLogin_iOS

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Использование IoC (Inversion of Control) - это один из способов, как указал Шон, но следует понимать, что IoC - это имя для одного метода вызова специфичного для платформы кода из проекта библиотеки, независимой от платформы, такого как проект .NET Standard.,Вы должны решить, какую библиотеку IoC использовать, или использовать функциональность IoC, встроенную в некоторые кроссплатформенные инфраструктуры, такие как MvvmCross или даже Xamarin.Forms Dependency Service (которая не является истинным контейнером IoC, ноэто скорее локатор сервисов, но он действительно позволяет вам вызывать специфичный для платформы код из проекта библиотеки .NET Standard или PCL, что в конечном итоге и нужно).

Тем не менее, есть еще одинвариант для вашего основного кода Xamarin.Forms, то есть использовать тип общей библиотеки проекта ..NET Standard - гораздо более распространенный вариант, который предлагается, когда вы следуете документам по началу работы для Xamarin.Forms (и Xamarin.Forms! = Xamarin, см. (1) ниже). Вы можете выбрать это при создании Xamarin.Решение для форм:

enter image description here

С типом проекта общей библиотеки для вашего основного кода Xamarin.Forms у вас будет доступ ко всему, на что ссылается ваша платформаконкретные проекты, так что вы получите доступ ко всему, что у вас есть доступ непосредственно в проектах Xamarin.iOS и Xamarin.Android.Услуги IoC или Dependency не требуются.

Всегда было много споров о том, является ли лучшим вариантом использование проекта общей библиотеки или проекта .NET Standard.У каждого есть свои плюсы и минусы.В двух словах, использование проекта .NET Standard заставляет вас использовать IoC для вызова кода конкретной платформы из проекта библиотеки и использовать пользовательские средства визуализации для доступа к свойствам элементов управления пользовательского интерфейса, зависящих от платформы, тогда как проект общей библиотеки предоставляет вам полный доступ ко всем классам.и библиотеки, доступные для конкретного проекта платформы, что делает ненужным внедрение зависимостей ... НО при использовании общего проекта, поскольку в одном и том же общем проекте вы можете использовать как специальный код Xamarin.Android, так и специальный код Xamarin.iOS, вам необходимо использоватьдирективы компилятора (#if и #endif), так что специфичный для iOS код компилируется только при сборке проекта iOS, а специфичный для Android код компилируется только при компиляции проекта Android.Невыполнение этого требования может вызвать проблемы компиляции и / или времени выполнения.Вот простой фрагмент кода, который покажет вам, как использовать директивы компилятора для изоляции специфичного для iOS и Android кода.Этот простой пример создаст кнопку, которая при нажатии представит предупреждение.Способ представления оповещения в iOS и Android различен, поэтому нам нужно выделить эти фрагменты кода в обработчике событий нажатия кнопки, чтобы на правильной платформе работал правильный код.

Сначала определите символы компилятора в опциях проекта.Щелкните правой кнопкой мыши проект Android и выберите Параметры проекта и выберите Компилятор слева.Затем в поле Определить символы добавьте ANDROID; , например:

enter image description here

Затем сделайте то же самоедля проекта iOS (но, очевидно, ввод IOS ):

enter image description here

Стоит отметить, что это параметр, зависящий от конфигурации,поэтому вам нужно добавить эти символы для всех конфигураций, которые вы будете использовать для создания своих проектов.

Затем создайте кнопку в MainPage.xaml:

<Button Text="Show me an alert!" 
        HorizontalOptions="Center" 
        VerticalOptions="CenterAndExpand" 
        Clicked="Handle_Clicked" />

Затем в MainPage.Код xaml.cs, стоящий за файлом:

    void Handle_Clicked(object sender, System.EventArgs e)
    {
#if ANDROID
        Toast.MakeText(MainActivity.Context, "I'm an Android Toast!", ToastLength.Long).Show();
#endif
#if IOS
        var alert = new UIAlertView("I'm an iOS Alert!", "I'm deprecated. but using here because I do not have easy access to my view controller at this time", null, "OK", null);
        alert.Show();
#endif
    }

Вам также понадобятся директивы компилятора вокруг операторов using:

#if ANDROID
    using Android.Widget;
    using SharedSample.Droid;
#endif
#if IOS
    using UIKit;
#endif

Так что, надеюсь, теперь вы лучше понимаете, как создавать кроссплатформенные приложения и некоторые проблемы, связанные с совместным использованием кода и использованием кода, специфичного для платформы.Несмотря на это, вы все равно не сможете добавить собственную страницу iOS (или собственную страницу Android) к свойству MainPage Xamarin.Forms, поскольку страница iOS НЕ является страницей Xamarin.Form (MainPage может принимать только подкласс Xamarin..Forms Page), но это должно показать вам, как вызывать специфический для платформы код из вашего общего кода.

О, теперь я вижу на ваших скриншотах, что вы добавили свою страницу Xamarin.Forms XAML в проект iOS ????Нет, это не способ обойти вашу проблему.Я бы серьезно предложил вам зарегистрироваться в Xamarin University .Вам нужно больше, чем просто фрагменты кода, вам нужно лучше понимать кроссплатформенную разработку, и моего не столь краткого учебника здесь недостаточно, чтобы вы могли понять, что я вижу.

Но вы знаете, что, я думаю, есть библиотека OAuth для Xamarin Forms , так что, возможно, вы можете сделать эту работу так, как она должна делать все для вашей платформы.Страница Nuget: https://www.nuget.org/packages/Xamarin.Auth/ Страница Github: https://github.com/xamarin/Xamarin.Auth Документы: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/data-cloud/authentication/oauth

Удачи!

(1) Xamarin была компанией, купленной Microsoft,Xamarin создал SDK, которые позволяли создавать приложения для iOS, Mac и Android, используя C # и .NET Framework. Xamarin.iOS SDK используется для создания приложений для iOS, Xamarin.Mac для приложений Mac и Xamarin.Android для приложений Android.Все они используют Mono , который является портом с открытым исходным кодом .NET (поскольку в то время .NET работал только на Windows и других платформах Microsoft ... хотя сейчас есть .NET Core, который является кроссплатформенным ..но это уже другая тема).Позже Xamarin представила Xamarin.Forms , которая представляет собой библиотеку кроссплатформенного пользовательского интерфейса (пользовательского интерфейса), которая позволяет создавать пользовательский интерфейс в общем коде и / или XAML.До появления Xamarin.Forms пользовательский интерфейс для каждой платформы должен был создаваться в проектах, специфичных для этой платформы, то есть пользовательский интерфейс для iOS был бы в проекте Xamarin.iOS, пользовательский интерфейс для Android был бы в проекте Xamarin.Android и т. Д., Но всеможет вызывать внутренний код (т. е. веб-запросы, модели и т. д.), который находится в одном проекте совместно используемой библиотеки, что позволяет разделять около 80% всего кода между проектами различных приложений платформы.С Xamarin.Forms для простого приложения возможен 100% обмен кодами.Xamarin.Forms по-прежнему использует проекты Xamarin.iOS и Xamarin.Android, а также проекты UWP в Windows для запуска пользовательского интерфейса, но Xamarin.Forms использует средства визуализации для визуализации элементов управления пользовательского интерфейса Xamarin.Forms в элементы, специфичные для платформы, т.е.Кнопка в Xam.Forms отображает UIButton на iOS и кнопку Android на Android.Однако Xamarin.Forms предоставляет вам доступ только к основным общим свойствам собственных элементов управления, поэтому, если вам нужен доступ к определенным собственным свойствам или функциям, вы должны использовать настраиваемое средство визуализации (для изменения элементов управления пользовательского интерфейса на собственной платформе и доступа к собственным).свойства элемента управления) и / или служба зависимостей (для запуска специфичного для платформы кода из основного проекта библиотеки Xam.Forms).

0 голосов
/ 22 ноября 2018

Ваш базовый проект не может ссылаться на конкретный проект платформы.Если бы вы могли это сделать, вы бы вернулись к использованию библиотек для конкретных платформ на неправильной платформе.

Вместо этого вам нужно создать класс или интерфейс в базовом проекте, который может расширяться каждым конкретным проектом вашей платформы.Таким образом, вы можете передавать этот базовый класс между проектами, не зная о какой-либо из используемых библиотек платформы.

Я бы порекомендовал шаблон IoC (Inversion of Control) для этой ситуации.Он абстрагирует обработку ссылок для вас и упрощает регистрацию ваших различных услуг.Взгляните на эту статью , которая решает точно такую ​​же ситуацию.

Надеюсь, это поможет!

...