繁体   English   中英

如何从Xamarin Forms显示iOS添加联系人屏幕?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM