Xamarin.ios 如何在MonoTouch中使用ABPeoplePickerNavigationController来选择联系人的特定电子邮件地址或电话号码?

Xamarin.ios 如何在MonoTouch中使用ABPeoplePickerNavigationController来选择联系人的特定电子邮件地址或电话号码?,xamarin.ios,addressbook,Xamarin.ios,Addressbook,我在一个项目中使用MonoTouch编写的,来选择联系人的特定电子邮件地址或电话号码 代码设置了一个委托,在委托中我实现了ShouldContinue方法,并使用所有联系人的Handle属性检索了联系人。不幸的是,它看起来有些变化,或者我使用了未记录的功能,或者我很幸运,因为现在当我在为iPhone 5更新应用程序时,代码不再工作 编辑:好的,我最初的想法是这是由MonoTouch的更改引起的,因为自从我上次使用这个应用程序以来,已经有很多更新。然而,我现在从我的设备上删除了它,并下载了我在应用

我在一个项目中使用MonoTouch编写的,来选择联系人的特定电子邮件地址或电话号码

代码设置了一个委托,在委托中我实现了ShouldContinue方法,并使用所有联系人的Handle属性检索了联系人。不幸的是,它看起来有些变化,或者我使用了未记录的功能,或者我很幸运,因为现在当我在为iPhone 5更新应用程序时,代码不再工作

编辑:好的,我最初的想法是这是由MonoTouch的更改引起的,因为自从我上次使用这个应用程序以来,已经有很多更新。然而,我现在从我的设备上删除了它,并下载了我在应用商店上的版本,它以同样的方式崩溃,空引用异常

这意味着是iOS升级导致我的代码无法正常工作

我的代码的目标是:

  • 选择一个人的特定电子邮件地址,不仅仅是此人,还要导航到此人的详细信息,并选择特定的电子邮件地址或电话号码
  • 下面的代码只处理电话号码,电子邮件代码看起来95%相似

    以下是构造选择器的代码:

    var picker = new ABPeoplePickerNavigationController();
    picker.Init();
    picker.DisplayedProperties.Clear();
    picker.DisplayedProperties.Add(ABPersonProperty.FirstName);
    picker.DisplayedProperties.Add(ABPersonProperty.Phone);
    var del = new PhonePickerDelegate();
    picker.Delegate = del;
    
    下面是委托类:

    private class PhonePickerDelegate : ABPeoplePickerNavigationControllerDelegate
    {
        public override bool ShouldContinue(ABPeoplePickerNavigationController peoplePicker, IntPtr selectedPerson, int propertyId, int identifier)
        {
            peoplePicker.DismissModalViewControllerAnimated(true);
    
            // THE NEXT LINE IS THE ONE THAT NO LONGER WORKS
            var contact = peoplePicker.AddressBook.SingleOrDefault(s => s.Handle == selectedPerson) as ABPerson;
    
            using (var phones = contact.GetPhones())
            {
                int index = phones.GetIndexForIdentifier(identifier);
                var phone = phones.GetValues()[index];
                var name = (contact.FirstName + " " + contact.MiddleName).Trim() + " " + contact.LastName;
                Selected(name + ": " + phone);
            }
            return false;
        }
    
        public override void Cancelled(ABPeoplePickerNavigationController peoplePicker)
        {
            peoplePicker.DismissModalViewControllerAnimated(true);
        }
    }
    
    不幸的是,此代码不再找到正确的联系人,因为没有一个联系人的句柄值与
    selectedPerson
    IntPtr
    值对应

    我的问题是:

  • 如何修复上述代码
  • 我可以修复上面的代码吗
  • 是否有其他类/方法/委托/事件或其他我应该使用的东西

  • 您可以执行以下操作: 请注意,AppDelegate.navigation将是您当前的
    NavigationController


    e.Person
    只会给你整个联系人。您可能希望执行以下操作:

    e.Person.GetEmails().FirstOrDefault
    

    希望这有帮助

    定义了
    peoplePicker
    的位置?
    DismissModalViewController已替换为
    DismissViewController
    e.Person.GetEmails().FirstOrDefault