我一直在用 MonoTouch 编写的项目中使用ABPeoplePickerNavigationController来选择联系人的特定电子邮件地址或电话号码。
代码设置了一个委托,在委托中我实现了 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);
}
}
不幸的是,此代码不再找到正确的联系人,因为没有一个联系人具有与该值对应的 HandleselectedPerson
IntPtr
值。
我的问题是:
- 如何修复上述代码?
- 我可以修复上面的代码吗?
- 是否有其他类/方法/委托/事件或其他我应该使用的东西?