2

作成したiPhoneから連絡先を削除しようとしています。連絡先を削除する良い例を見つけようとしましたが、見つかりませんでした。連絡先の追加は非常に簡単に思えましたが、削除は難しいようです。次のコードは機能しませんが、もっともらしいと思われます。

ABAddressBookRef addressBook = ABAddressBookCreate();
ABRecordRef delete = ABPersonCreate();

ABRecordSetValue(delete, kABPersonFirstNameProperty, @"Max", nil);
ABRecordSetValue(delete, kABPersonLastNameProperty, @"Mustermann", nil); 

ABAddressBookRemoveRecord(addressBook, delete, &error);
ABAddressBookSave(addressBook, &error);

誰かが私を助けてくれませんか。

よろしくお願いします。

マックス

4

1 に答える 1

8

問題は、名簿のABRecord中にないものを作成していることです。あなたがしなければならないことは、ABRedordからのの配列を検索することABAddressBookです。私はあなたのためにこれを行う方法を書きました:

CFErrorRef error = nil;

ABAddressBookRef addressBook = ABAddressBookCreate();
__block ABRecordRef toDelete = ABPersonCreate();

ABRecordSetValue(toDelete, kABPersonFirstNameProperty, @"Max", nil);
ABRecordSetValue(toDelete, kABPersonLastNameProperty, @"Mustermann", nil);

// Gets the array of everybody in the address book
NSArray *peopleArray = (__bridge NSArray *) ABAddressBookCopyArrayOfAllPeople(addressBook);

// Creates a test predicate to see if the ABRecord has the same name as toDelete
BOOL (^predicate)(id obj, NSUInteger idx, BOOL *stop) = ^(id obj, NSUInteger idx, BOOL *stop) {
    ABRecordRef person = (__bridge ABRecordRef)obj;
    CFComparisonResult result =  ABPersonComparePeopleByName(person, delete, kABPersonSortByLastName);
    bool pass = (result == kCFCompareEqualTo);
    if (pass) {
        toDelete = person;
    }
    return (BOOL) pass;
};

int idx = [peopleArray indexOfObjectPassingTest:predicate];

bool removed = ABAddressBookRemoveRecord(addressBook, toDelete, &error);
bool saved = ABAddressBookSave(addressBook, &error);

ABRecordブロックコードを変更することで、インスタンスの比較方法を変更できます。現在行っているのは、連絡先の名前を比較することだけです。

このコードの注意点は、名前が'sABRecordと一致するsのインスタンスを1つだけ削除することです。delete

于 2012-05-16T21:44:08.723 に答える