簡體   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