Xamarin.IOS从CNContactViewController.FromContact返回到应用程序
我有一个用Xamarin为IOS和Android编写的应用程序,其中有一个联系人列表,当我点击其中一个联系人时,我想在手机的通讯录中打开相应的联系人。我有一个在IOS上实现方法的接口: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
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将显示后退按钮。当然,你得把礼物换成推送。啊,我明白了。到目前为止,这是有效的。但我有一个底部的选项卡栏,这里没有显示我在其中进行的任何导航的后退按钮。所以我得看看我能怎么解决这个问题。但我想这是另一个问题。感谢您的帮助:好的,我根据以下示例相应地调整了代码:。现在,导航通常与后退按钮一起工作。不幸的是,不适用于联系人对话框。我更新了我原来的帖子。有什么想法吗=