【问题标题】:How to get ABPerson from an IntPtr using Monotouch如何使用 Monotouch 从 IntPtr 获取 ABPerson
【发布时间】:2011-08-08 09:05:55
【问题描述】:

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;
   }
}   

【问题讨论】:

    标签: c# iphone xamarin.ios intptr abpersonviewcontroller


    【解决方案1】:

    遗憾的是,接受 IntPtr 的 ABPerson 构造函数在 MonoTouch 中是内部的。您可以:

    • 使用反射调用 .ctor
    • 使用另一个 API 来检索 ABPerson 实例

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

    我会看看为什么这个 .ctor 是内部的(afaik 许多这样的 .ctor 在 MonoTouch 中是公共的),如果可能(即如果没有替代品),请在即将发布的版本中修复此问题。

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

    【讨论】:

    • 我之前使用过 SelectPerson 事件,但由于这个问题,我不得不将其更改为 ABPeoplePickerNavigationControllerDelegate:link。如果我使用 SelectPerson 事件,则不再使用我的委托(出于某种原因)。所以不幸的是,这对我来说不是一个选择。拜托,你能帮我用这种反射方式吗?甚至可以使用反射调用内部受保护的构造函数吗?提前致谢
    • 请在 bugzilla.xamarin.com 上填写错误报告,我们将尝试找出测试解决方案以使其正常工作。短期解决方案仍然使用反射。
    • 在 ABPeoplePickerNavigationController 上使用 SelectPerson 事件在选择某些人时似乎会崩溃。特别是这个苹果联系人,dl.dropbox.com/u/11374958/Apple%20Inc..vcf
    【解决方案2】:

    没试过,但你可以:

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

    【讨论】:

    • 它不知道 SingleOrDefault 方法 :( 但我试图遍历所有人并将他们的“句柄”与我的 selectPerson IntPtr 进行比较,但它们不匹配。它们可能是不同的指针。
    • SingleOrDefault 是 System.Linq 命名空间的扩展方法。您可以将其添加到您的文件中。我会再检查一下。
    • 这会在没有调试信息的情况下崩溃 :( 实际上,这就像您使用 peoplePicker.SelectPerson += delegate(object picker_sender, ABPeoplePickerSelectPersonEventArgs picker_e){ } 时一样崩溃
    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    相关资源
    最近更新 更多