[英]How to show iOS add contact screen from Xamarin Forms?
我正在嘗試使用Xamarin Forms顯示iOS添加聯系人屏幕。 從我可以看出,Xamarin Forms不支持此功能,但Xamarin iOS支持。 不幸的是,我不能讓他們一起工作。 我的意思是“在一起”是我需要從Xamarin表單頁面訪問NavigationController。
能做到嗎?
我有一個示例解決方案,在這里演示了該問題: https : //github.com/pawelpabich/XamarinFormsContacts 。 我還將最重要的代碼放在下面。
public void ShowContact(NavigationPage page)
{
var newPersonController = new ABNewPersonViewController();
var person = new ABPerson();
person.FirstName = "John";
person.LastName = "Doe";
newPersonController.DisplayedPerson = person;
var controller = page.CreateViewController();
//!!!!---> controller.NavigationController is null !!!!!<----
controller.NavigationController.PushViewController(newPersonController, true);
}
我更新了存儲庫,現在包含了可以正常工作的代碼。
使用Xamarin.Forms時(使用NavigationPage時)有一個UINavigationController,但是您必須搜索它。 這是我掌握它的唯一方法。 其他方法,CreateViewController和RendererFactory實際上創建了一個新的ViewController,這不是您想要的。
public void ShowContact(NavigationPage page)
{
var newPersonController = new ABNewPersonViewController();
var person = new ABPerson();
person.FirstName = "John";
person.LastName = "Doe";
newPersonController.Title = "This is a test";
newPersonController.DisplayedPerson = person;
UINavigationController nav = null;
foreach (var vc in
UIApplication.SharedApplication.Windows[0].RootViewController.ChildViewControllers)
{
if (vc is UINavigationController)
nav = (UINavigationController)vc;
}
nav.PresentModalViewController(new UINavigationController (newPersonController), true);
}
我還嘗試創建一個PersonPage和PersonPageRenderer,因為這將是最干凈的解決方案,但我無法使其正常運行。 如果您花了一些時間,這可能會起作用。
[assembly: ExportRenderer(typeof(PersonPage), typeof(PersonPageRenderer))]
public class PersonPageRenderer : ABNewPersonViewController, IVisualElementRenderer, IDisposable, IRegisterable
由於“ iOS添加聯系人”屏幕是本機iOS API,並且您的應用程序邏輯在PCL中,因此您需要使用DependancyService。
1)為此,請在PCL中創建一個提供功能的接口,例如
public interface ILocalAddContact
{
void DisplayContactScreen(Contact contact)
}
2)在本機應用程序中實現接口:
public class LocalAddContactiOS : ILocalAddContact
{
public void DisplayContactScreen(Contact contact)
{
//... do iOS Magic
}
}
3)在本機文件的頂部注冊依賴項
[assembly: Xamarin.Forms.Dependency(typeof(LocalAddContactiOS))]
4)從iOS項目的iOS項目中獲取依賴關系
var addContact = DependencyService.Get<ILocalAddContact> ();
addContact.DisplayContactScreen (contact);
如果您在github上查看此示例應用程序 ,它非常相似(但用於CreateCalendar)。
Pawel的問題是,當您使用Xamarin.Forms時,沒有創建NavigationController(據我所知,至少在XF 1.3+中,也許Michael會證明我錯了)。 如果要創建新的地址boo元素,則可以使用這種方法- 如何通過單點觸控將聯系人添加到iPhone通訊錄中?
好的,這就是我最終實現的方式。 我手動創建了UINavigationController並將其用於Xamarin.Forms之外的導航。
using System;
using System.Collections.Generic;
using System.Linq;
using Foundation;
using UIKit;
using Xamarin.Forms;
using AddressBookUI;
using AddressBook;
namespace TestContacts.iOS
{
[Register ("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{
UIWindow window;
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init ();
window = new UIWindow(UIScreen.MainScreen.Bounds);
var nav =
new UINavigationController(new App ().MainPage.CreateViewController());
ContactsShared.Instance = new TouchContacts (nav);
window.RootViewController = nav;
window.MakeKeyAndVisible();
return true;
}
}
public class TouchContacts : IContactsShared {
UINavigationController nav;
public TouchContacts(UINavigationController nav){
this.nav = nav;
}
public void Show() {
var newPersonController = new ABNewPersonViewController();
newPersonController.NewPersonComplete +=
(object sender, ABNewPersonCompleteEventArgs e) =>
{
nav.PopViewController(true);
};
var person = new ABPerson();
person.FirstName = "John";
person.LastName = "Doe";
newPersonController.DisplayedPerson = person;
nav.PushViewController(newPersonController, true);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.