0

AddressBook フレームワークの動作がおかしいです。私はこの方法で人ピッカーコントローラーを作成して表示しています:

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.peoplePickerDelegate = self;
NSArray *displayedItems = [NSArray arrayWithObjects:[NSNumber numberWithInt:kABPersonFirstNameProperty], [NSNumber numberWithInt:kABPersonLastNameProperty], nil];
picker.displayedProperties = displayedItems;
[self presentViewController: picker animated:YES completion: nil];

次に、デリゲートには次のものがあります。

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
    myPersonRec = person;
    [self dismissViewControllerAnimated:YES completion: nil];
    return NO;
}

後で myPersonRec プロパティにアクセスしようとすると、名前と姓 (ピープル ピッカーに表示されていたもの) しか読み取ることができず、他のすべてのプロパティは nil です。戻り値を に変更するとYES、電話番号などは取得できますが、人物の画像は取得できません。私は何を間違っていますか?

4

1 に答える 1

0

問題の原因が見つかりました:

ABPersonオブジェクトは一度にメモリにロードされません。ABAddressBook部分的にロードされ、必要に応じて新しいフィールドまたはイメージがロードされます。適切にロードするには、このオブジェクトを既存のインスタンスに関連付ける必要があります。人物ピッカー ビュー コントローラーを使用すると、ピッカーが閉じられたABAddressBook後に解放された独自のインスタンスが参照されたため、ビュー コントローラーが閉じられた後に新しいデータを取得できませんでした (ただし、以前に読み込まれたエントリには引き続きアクセスできました)。

この問題を解決するためABAddressBookに、モデル クラスのシングルトンに共有インスタンスを作成し、必要なときにいつでも使用できるようにしました。私はアドレス帳から読んでいるだけなので、それは良い解決策になるはずです。

したがって、ピッカー作成コードは最終的に次のようになります。

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.peoplePickerDelegate = self;
NSArray *displayedItems = [NSArray arrayWithObjects:[NSNumber numberWithInt:kABPersonFirstNameProperty], [NSNumber numberWithInt:kABPersonLastNameProperty], nil];
picker.displayedProperties = displayedItems;
picker.addressBook = [[MyModel instance] sharedAddressBookRef];
[self presentViewController: picker animated:YES completion: nil];
于 2012-10-16T14:02:12.460 に答える