如何使用Monotouch从IntPtr获取ABPerson

时间:2011-08-08 09:05:55

标签: c# iphone xamarin.ios intptr abpersonviewcontroller

在Monotouch中有一种方法如何从IntPtr获取ABPerson对象。我正在使用ABPeoplePickerNavigationController及其ABPeoplePickerNavigationControllerDelegate。我必须在方法ShouldContinue中阅读所选人员的一些属性。我的代码如下所示:

ABPeoplePickerNavigationController nc = new ABPeoplePickerNavigationController();
nc.Delegate = new CustomABPeoplePickerNavigationControllerDelegate();

我的自定义委托看起来像这样:

public class CustomABPeoplePickerNavigationControllerDelegate : ABPeoplePickerNavigationControllerDelegate
{           
   public override bool ShouldContinue (ABPeoplePickerNavigationController peoplePicker, IntPtr selectedPerson)
   {
       // *** HERE I HAVE TO GET ABPerson FROM IntPtr ***
       peoplePicker.DismissModalViewControllerAnimated(false);
       return true;
   }
}   

2 个答案:

答案 0 :(得分:1)

可悲的是,接受IntPtr的ABPerson构造函数是MonoTouch的内部构造函数。你可以:

  • 使用反射来调用.ctor
  • 使用其他API检索ABPerson实例

但你不能使用继承来解决这个问题,因为基数(ABRecord).ctor也是内部的。

我会看看为什么这个.ctor是内部的(afaik很多这样的。在MonoTouch中是公开的),如果可能的话(即如果没有其他选择),请为即将发布的版本修复此问题。

编辑:进一步阅读建议您在ABPeoplePickerNavigationController上使用SelectPerson事件。这将使用一个内部委托,将IntPtr转换为ABPerson实例,解决您的问题:)

答案 1 :(得分:0)

如果有效可行,但你可以:

ABPerson person = peoplePicker.AddressBook.SingleOrDefault(s => s.Handle == selectedPerson) as ABPerson;