簡體   English   中英

如何在iOS項目中將類引用到Xamarin中的主項目

[英]How to reference class from iOS project to the main project in xamarin

我正在創建一個應用程序,其中的登錄將使用auth0處理。 但是由於可用的Auth0 NuGet軟件包,我不得不為Android和iOS創建單獨的登錄頁面。 所以在app.xaml.cs類,我現在必須引用Login_iOScase Device.iOS: MainPage = new Login_iOS⁩(); 但我遇到一個錯誤,因為xamarin找不到類Login_iOS 我很確定這是因為我沒有正確地引用它,而且似乎找不到正確引用它的方法。 下面的屏幕截圖應該可以幫助我解釋我的情況。

App.xaml.cs 登錄_iOS

肖恩(Shawn)指出,使用IoC(控制反轉)是一種解決方法,但請理解,IoC是從與平台無關的庫項目(如.NET Standard項目)中調用特定於平台的代碼的一種方法的名稱。 您必須決定要使用的IoC庫,還是要使用某些跨平台框架(例如MvvmCross甚至Xamarin.Forms Dependency Service ,它不是真正的IoC容器,而是更多的服務定位器)中內置的IoC功能。但確實可以使您從.NET Standard或PCL庫項目中調用平台特定的代碼,這最終是您想要做的)。

也就是說,您的核心Xamarin.Forms代碼還有另一種選擇,那就是使用共享庫項目類型。 到目前為止,.NET Standard是更常見的選項,當您遵循Xamarin.Forms(和Xamarin.Forms!= Xamarin參見下面的(1))入門文檔時,建議使用該選項。創建Xamarin時可以選擇此選項。表格解決方案:

在此處輸入圖片說明

使用核心Xamarin.Forms代碼的共享庫項目類型,您將可以訪問平台特定項目中引用的所有內容,因此您可以直接訪問Xamarin.iOS和Xamarin.Android項目中的所有內容。 。 不需要IoC或依賴項服務。

關於使用共享庫項目還是.NET Standard項目是否是最佳方法一直存在很多爭論。 每種都有優點和缺點。 簡而言之,使用.NET Standard項目強制您使用IoC從庫項目中調用平台特定的代碼,並使用自定義渲染器訪問UI控件的平台特定的屬性,而“共享庫”項目則使您可以完全訪問所有類以及特定於平台的項目可用的庫,因此不需要依賴注入...但是使用共享項目時,由於您可以在同一共享項目中同時擁有Xamarin.Android特定和Xamarin.iOS特定的代碼,因此您需要使用編譯器指令( #if#endif ),以便僅在構建iOS項目時才編譯iOS特定代碼,而僅在編譯Android項目時才編譯Android特定代碼。 否則可能會導致編譯和/或運行時問題。 這是一段簡單的代碼,向您展示如何使用編譯器指令隔離iOS和Android特定的代碼。 這個簡單的示例將創建一個按鈕,在點擊該按鈕時將顯示一個警報。 iOS和Android上如何顯示警報不同,因此我們需要在按鈕單擊事件處理程序中隔離那些代碼位,以便正確的代碼在正確的平台上運行。

首先在項目選項中定義編譯器符號。 右鍵單擊Android項目,然后選擇“ 項目選項”,然后在左側選擇“ 編譯器 ”。 然后在“ 定義符號”字段中,添加ANDROID; ,例如:

在此處輸入圖片說明

然后對iOS項目執行相同的操作(但顯然要進入IOS ):

在此處輸入圖片說明

值得注意的是,這是與配置有關的設置,因此您需要為將用於構建項目的所有配置添加這些符號。

接下來在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

因此,希望現在您可以更好地了解如何制作跨平台應用程序,以及有關共享代碼和使用平台特定代碼的一些挑戰。 綜上所述,您仍然無法向Xamarin.Forms MainPage屬性添加本機iOS頁面(或本機Android頁面),因為iOS頁面不是Xamarin.Form頁面(MainPage只能接受Xamarin的子類.Forms頁面),但這應該向您展示如何從共享代碼中調用平台特定的代碼。

哦,現在我在您的屏幕快照中看到您已將Xamarin.Forms XAML頁面添加到iOS項目中了? 不,這不是解決您問題的方法。 我會認真建議您注冊Xamarin大學 您不僅需要代碼片段,還需要更好地理解跨平台開發,而我的簡短介紹還不足以使您從我所看到的內容中獲益。

但是,您知道什么,我想有一個Xamarin FormsOAuth庫 ,因此也許您可以進行這項工作,因為它應該為您完成所有平台特定的工作。 Nuget頁面: https ://www.nuget.org/packages/Xamarin.Auth/ Github頁面: https : //github.com/xamarin/Xamarin.Auth Docs: https ://docs.microsoft.com/zh-cn / xamarin / xamarin-forms / data-cloud / authentication / oauth

祝好運!

(1)Xamarin是被Microsoft收購的公司。 Xamarin制作了SDK,允許使用C#和.NET框架制作適用於iOS,Mac和Android的應用程序。 Xamarin.iOS SDK用於制作iOS應用, Xamarin.Mac的Mac應用程序,並Xamarin.Android for Android應用程序。 所有人都使用Mono ,這是.NET的開源端口(因為.NET當時僅在Windows和其他Microsoft平台上運行...盡管現在有.NET Core是跨平台的...但這是另一個主題)。 后來Xamarin引入了Xamarin.Forms ,它是一個跨平台的UI(用戶界面)庫,允許使用通用代碼和/或XAML創建UI。 在Xamarin.Forms之前,必須在特定於平台的項目中創建每個平台的UI,即,iOS的UI將在Xamarin.iOS項目中,Android的UI將在Xamarin.Android項目中,等等。可以調用駐留在一個共享庫項目中的后端代碼(即Web請求,模型等),從而允許在不同平台應用程序項目之間共享大約80%的總代碼。 使用Xamarin.Forms,對於一個簡單的應用程序,可以100%共享代碼。 Xamarin.Forms仍然使用Xamarin.iOS和Xamarin.Android項目以及Windows上的UWP項目來啟動UI,但是Xamarin.Forms使用渲染器將Xamarin.Forms UI控件渲染為平台特定的控件,即Xam.Forms中的Button在iOS上呈現為UIButton,在Android上呈現為Android Button。 但是Xamarin.Forms僅允許您訪問本機控件的核心通用屬性,因此,如果您需要訪問特定的本機屬性或功能,則必須使用自定義渲染器(在本機平台上修改UI控件並有權訪問本機控件的屬性)和/或依賴項服務(以運行核心Xam.Forms庫項目中的平台特定代碼)。

您的基礎項目無法引用平台特定的項目。 如果可以這樣做,您將回到在錯誤平台上使用特定於平台的庫的狀態。

相反,您需要在基礎項目中創建一個類或接口,每個平台特定項目都可以擴展該類或接口。 這樣,您可以在項目之間傳遞該基類,而無需了解正在使用的任何平台特定的庫。

對於這種情況,我建議使用IoC(控制反轉)模式。 它為您抽象了參考處理,並簡化了各種服務的注冊。 看一下正在解決完全相同情況的這篇文章

我希望這有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM