0

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

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

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

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

我的代码的目标:

  1. 选择一个人的特定电子邮件地址,不仅仅是这个人,而是导航到这个人的详细信息,并选择一个特定的电子邮件地址或电话号码。

下面的代码只处理电话号码,电子邮件代码看起来有 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值。

我的问题是:

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

1 回答 1

0

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


using MonoTouch.AddressBookUI;
using MonoTouch.AddressBook;

ABPeoplePickerNavigationController _contactController = new ABPeoplePickerNavigationController ();
            AppDelegate.navigation.PresentViewController (_contactController, true, null);

            _contactController.Cancelled += delegate {
                AppDelegate.navigation.DismissViewController (true, null);
                return;
            };

            _contactController.SelectPerson += delegate(object sender, ABPeoplePickerSelectPersonEventArgs e) {
                _importedContact = e.Person;
                AppDelegate.navigation.DismissViewController (true, delegate {
                    // What to do when you dismiss the picker here.
                });
            };

e.Person只会给你整个联系。你会想做这样的事情:

e.Person.GetEmails().FirstOrDefault

希望这可以帮助

于 2013-02-22T21:38:11.843 回答