0

MonoTouch で記述されたプロジェクトでABPeoplePickerNavigationControllerを使用して、連絡先の特定の電子メール アドレスまたは電話番号を選択しています。

コードはデリゲートを設定し、デリゲートに ShouldContinue メソッドを実装し、すべての連絡先の Handle プロパティを使用して連絡先を取得しました。残念ながら、何かが変更されたように見えます。または、文書化されていない機能を使用したか、単に幸運だったようです。iPhone 5 用のアプリを更新している最中に、コードが機能しなくなったためです。

編集: わかりました。私が最初に考えたのは、これは MonoTouch の変更が原因であるということでした。これは、このアプリで最後に作業してからかなりの数の更新があったためです。ただし、デバイスから削除し、アプリストアにあるバージョンをダウンロードすると、同じ方法でクラッシュし、null 参照例外が発生します。

これは、私のコードが機能しなくなったのは 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);
    }
}

残念ながら、値に対応するハンドル値を持っている連絡先がないため、このコードは正しい連絡先を見つけることができなくなりましたselectedPerson 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 に答える