Xamarin.IOS从CNContactViewController.FromContact返回到应用程序

Xamarin.IOS从CNContactViewController.FromContact返回到应用程序,ios,xamarin.ios,Ios,Xamarin.ios,我有一个用Xamarin为IOS和Android编写的应用程序,其中有一个联系人列表,当我点击其中一个联系人时,我想在手机的通讯录中打开相应的联系人。我有一个在IOS上实现方法的接口: private void ShowContactDialog(string addressbookId, bool isEdit = false) { var contact = new AddressBookService().GetCnContactById(addressbookId

我有一个用Xamarin为IOS和Android编写的应用程序,其中有一个联系人列表,当我点击其中一个联系人时,我想在手机的通讯录中打开相应的联系人。我有一个在IOS上实现方法的接口:

private void ShowContactDialog(string addressbookId, bool isEdit = false)
    {
        var contact = new AddressBookService().GetCnContactById(addressbookId);
        var view = CNContactViewController.FromContact(contact);
        view.Editing = isEdit;

        DisplayView(view);
    }

    private static void DisplayView(CNContactViewController view)
    {
        var window = UIApplication.SharedApplication.KeyWindow;
        var vc = window.RootViewController;
        while (vc.PresentedViewController != null)
        {
            vc = vc.PresentedViewController;
        }

        if (vc is UINavigationController navController)
        {
            vc = navController.ViewControllers.Last();
        }
        vc.PresentViewController(new UINavigationController(view), true, null);
    }
只要打开联系人,它就可以工作:

现在的问题是,只有一个编辑按钮,但现在完成了,取消或返回按钮。因此,我必须杀掉整个应用程序,然后重新启动它以返回

有没有办法添加一个类似于“编辑”按钮的额外按钮来再次关闭对话框

编辑:我按照Kevin Li的评论中的建议调整了代码

        private void ShowContactDialog(string addressbookId, bool isEdit = false)
    {
        var contact = new AddressBookService().GetCnContactById(addressbookId);
        var view = CNContactViewController.FromContact(contact);
        view.Editing = isEdit;

        GetCurrentViewController().NavigationController.PushViewController(view, true);
    }

    private static UIViewController GetCurrentViewController()
    {
        var window = UIApplication.SharedApplication.KeyWindow;
        var vc = window.RootViewController;
        while (vc.PresentedViewController != null)
        {
            vc = vc.PresentedViewController;
        }

        if (vc is UINavigationController navController)
        {
            vc = navController.ViewControllers.Last();
        }
        return vc;

    }
现在,它显示在选项卡中:

不幸的是,后退按钮也没有显示出来。 我试着做一个新的UINavigationController,但没有改变任何事情

编辑2: 我另一次调整了选项卡的创建方式。我的MainViewController如下所示:

[MvxRootPresentation(WrapInNavigationController = true)]
public class MainViewController : MvxTabBarViewController<MainViewModel>
{
    private bool constructed;
    private bool firstTimePresented = true;

    public MainViewController()
    {
        constructed = true;

        // need this additional call to ViewDidLoad because UIkit creates the view before the C# hierarchy has been constructed
        ViewDidLoad();
    }

    public override async void ViewWillAppear(bool animated)
    {
        base.ViewWillAppear(animated);

        if (firstTimePresented)
        {
            // Initialize the tabs
            firstTimePresented = false;
            await ViewModel.GoToContactListCommand.ExecuteAsync();
            await ViewModel.GoToBirthdayListCommand.ExecuteAsync();
            await ViewModel.GoToProfileListCommand.ExecuteAsync();
            await ViewModel.GoToSettingsCommand.ExecuteAsync();
        }
    }

    public override void ViewDidLoad()
    {
        if (!constructed)
            return;

        base.ViewDidLoad();

        Title = "Connect Update";
        EdgesForExtendedLayout = UIRectEdge.None;
        View.BackgroundColor = UIColor.White;
    }
}
在每个视图上,谁将成为选项卡必须具有此属性:

[MvxTabPresentation(TabIconName = "IconCake", TabName = "Birthdays")]
    public partial class BirthdayView : MvxViewController<BirthdayViewModel>
打开触点的代码与上述代码相同。现在,它创建了一个没有选项卡的新视图,但使用了后退按钮,完全如所愿:

现在的问题是,只有一个编辑按钮,但现在完成了,取消或返回按钮

这是因为查看时isEdit的值。Editing=isEdit;这是错误的。因此,当您显示CNContactViewController时,只有一个编辑按钮。单击“编辑”按钮时,它将更改为编辑模式,并显示“取消”和“完成”按钮

或者,您可以将isEdit的值设置为true,然后当CNContactViewController出现时,将显示取消和完成按钮

因此,我必须杀掉整个应用程序,然后重新启动它以返回

有没有办法添加一个类似于“编辑”按钮的额外按钮来再次关闭对话框

您不必关闭并重新启动应用程序来关闭对话框。您只需在delegate:CNContactViewControllerDelegate中实现didcomlete,在用户编辑完联系人后,单击“完成”按钮或单击“取消”按钮取消对话框

以下是相关的代码片段:

var view = CNContactViewController.FromContact(contact);
view.Delegate = new MyCNConatactViewControllerDelegate();

public class MyCNConatactViewControllerDelegate : CNContactViewControllerDelegate
{
    public override void DidComplete(CNContactViewController viewController, Contacts.CNContact contact)
    {
        viewController.NavigationController.DismissViewController(true, null);
    }
}
更新:

要在CNContactViewController中显示后退按钮:

确保UI层次结构如下:导航->ViewcontrollerPage->CNContactViewController。然后将方法从Present更改为Push以显示CNContactViewController,如下所示:


this.NavigationController.PushViewControllerview,true

问题是我只想显示联系人。在通讯录中,不要编辑它。从你看到的,我必须调整它,以另一种方式做。哦,我明白了。你的UI层次结构是什么。如果它是这样的:ViewcontrollerPage->CNContactViewController,您可以将其更改为导航->ViewcontrollerPage->CNContactViewController。然后将PresentViewController相关代码更改为this.NavigationController.PushViewControllerview,true;然后ViewControllerPage是导航的rootViewController。CNContactViewController将显示后退按钮。当然,你得把礼物换成推送。啊,我明白了。到目前为止,这是有效的。但我有一个底部的选项卡栏,这里没有显示我在其中进行的任何导航的后退按钮。所以我得看看我能怎么解决这个问题。但我想这是另一个问题。感谢您的帮助:好的,我根据以下示例相应地调整了代码:。现在,导航通常与后退按钮一起工作。不幸的是,不适用于联系人对话框。我更新了我原来的帖子。有什么想法吗=