如何从 Xamarin Forms 显示 iOS 添加联系人屏幕?
How to show iOS add contact screen from Xamarin Forms?
我正在尝试使用 Xamarin Forms 显示 iOS 添加联系人屏幕。据我所知,Xamarin Forms 不支持开箱即用,但 Xamarin iOS 支持。不幸的是我不能让他们一起工作。 "together" 的意思是我需要从 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);
}
我更新了存储库,它现在包含有效的代码。
因为 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项目的依赖
var addContact = DependencyService.Get<ILocalAddContact> ();
addContact.DisplayContactScreen (contact);
如果您查看 github 上的 this sample application,它非常相似(但用于 CreateCalendar)。
Pawel,问题是当您使用 Xamarin.Forms 时,不会创建 NavigationController(据我所知,至少在 X.F 1.3+ 中,也许 Michael 会证明我错了)。如果你想创建新的地址 boo 元素,你可以使用这种方法 - How do you add contacts to the iPhone Address book with monotouch?
好的,这就是我最终实现的方式。我手动创建了 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);
}
}
}
使用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
我正在尝试使用 Xamarin Forms 显示 iOS 添加联系人屏幕。据我所知,Xamarin Forms 不支持开箱即用,但 Xamarin iOS 支持。不幸的是我不能让他们一起工作。 "together" 的意思是我需要从 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);
}
我更新了存储库,它现在包含有效的代码。
因为 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项目的依赖var addContact = DependencyService.Get<ILocalAddContact> ();
addContact.DisplayContactScreen (contact);
如果您查看 github 上的 this sample application,它非常相似(但用于 CreateCalendar)。
Pawel,问题是当您使用 Xamarin.Forms 时,不会创建 NavigationController(据我所知,至少在 X.F 1.3+ 中,也许 Michael 会证明我错了)。如果你想创建新的地址 boo 元素,你可以使用这种方法 - How do you add contacts to the iPhone Address book with monotouch?
好的,这就是我最终实现的方式。我手动创建了 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);
}
}
}
使用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