[英]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.