Как получить ABPerson от IntPtr с помощью Monotouch - PullRequest
0 голосов
/ 08 августа 2011

Есть ли способ в Monotouch, как получить объект ABPerson из IntPtr. Я использую 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 ]

1 голос
/ 08 августа 2011

К сожалению, конструктор ABPerson, который принимает IntPtr, является внутренним в MonoTouch. Вы можете либо:

  • используйте рефлексию для вызова .ctor
  • использовать другой API для получения экземпляра ABPerson

, но вы не можете использовать наследование для решения этой проблемы, поскольку base (ABRecord) .ctor также является внутренним.

Я посмотрю, почему этот .ctor является внутренним (многие из таких .ctor общедоступны в MonoTouch) и, если возможно (т. Е. Если нет альтернативы), исправьте это в будущих выпусках.

РЕДАКТИРОВАТЬ: дальнейшее чтение предлагает использовать событие SelectPerson для ABPeoplePickerNavigationController. При этом будет использован внутренний делегат, который преобразует IntPtr в экземпляр ABPerson, решая вашу проблему:)

0 голосов
/ 08 августа 2011

Не пробовал, если это работает, но вы могли бы:

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