6

メールのある連絡先のみを表示する ABAddressBook を表示したいので、次のようにしてみました。

    ABAddressBookRef addressBook = ABAddressBookCreate();
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
    CFIndex nPeople = ABAddressBookGetPersonCount( addressBook );

    for( CFIndex emailIndex = 0; emailIndex < nPeople; emailIndex++ ) {
        ABRecordRef person = CFArrayGetValueAtIndex( allPeople, emailIndex );
        ABMutableMultiValueRef emailRef=ABRecordCopyValue(person, kABPersonEmailProperty);
        int emailCount = ABMultiValueGetCount(emailRef);
        if(emailCount == 0) {
            ABAddressBookRemoveRecord(addressBook, person, NULL);
        }   
    }
    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
    picker.addressBook = addressBook;
    picker.peoplePickerDelegate = self;
    [self presentModalViewController:picker animated:YES];

コントローラーは表示されますが、すべての連絡先が表示され、メールのない連絡先を選択するとクラッシュします。ABAddressBookSave() を呼び出すと、電子メールを含むすべての連絡先が削除されますが、システムの連絡先からも削除される永続的な変更です。これを行う正しい方法は何ですか?

4

5 に答える 5

1

メールを含む連絡先の配列を作成し、それを UITableViewController に表示する必要がある場合があります。これは、そのような配列を構築する方法です: https://stackoverflow.com/a/13980023/745862。ABPersonViewController または ABUnknownPersonViewController を使用して、連絡先の詳細を表示できます。

于 2013-05-16T07:27:25.443 に答える
0

次のような電子メールの値のみを表示しようとしましたか:

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.displayedProperties = @[@(kABPersonEmailProperty)];

おそらくそれはすでに行っています、あなたが望むものは何ですか?しかし、それをテストしませんでした。

于 2014-02-02T11:30:29.817 に答える
0

一時的なアドレス帳を作成して、電子メール アドレスを持つ連絡先を入力することを検討したことはありますか?

于 2012-08-18T19:28:43.437 に答える
0

iOS 8 から、ABPeoplePickerNavigationController には問題を解決するプロパティがあります。

@property (nonatomic,copy) predicateForEnablingPerson

Apple doc のコード例: https://developer.apple.com/library/prerelease/ios/samplecode/PeoplePicker/Listings/PeoplePicker_AAPL_8or7_EmailPickerViewController_m.html )

ABPeoplePickerNavigationController* abPicker = [ABPeoplePickerNavigationController new];
abPicker.peoplePickerDelegate = self;
//...
if ([abPicker respondsToSelector:@selector(setPredicateForEnablingPerson:)]){
    // The people picker will enable selection of persons that have at least one email address.
    abPicker.predicateForEnablingPerson = [NSPredicate predicateWithFormat:@"emailAddresses.@count > 0"];
}

iOS9 以降、ABPeoplePickerNavigationController は非推奨になっていることに注意してください。新しいCNContactPickerViewControllerをプロパティと同じ方法で使用できます。

@property(nonatomic, copy) NSPredicate *predicateForEnablingContact

ドキュメントから:

このプロパティの値を設定して、emailAddresses.@count > 0 のように選択可能にする連絡先を決定し、電子メール アドレスを持つすべての連絡先を選択可能にすることができます。このプロパティに述語が設定されていない場合、すべての連絡先が選択可能になります。

于 2015-10-21T12:44:49.050 に答える
0

メール アドレスのないすべての連絡先を AddressBook から削除しましたが、最後に AddressBook を保存しませんでした。AddressBook が ABPeoplePickerNavigationController から読み込まれると、以前の変更はすべて失われます。これを試して:

if (ABAddressBookHasUnsavedChanges(addressBook))
    ABAddressBookSave(addressBook, NULL)

ところで、CFRelease() addressBook、allPeople、emailRef を忘れないでください。

于 2014-02-02T11:23:32.973 に答える