Это правильный способ удалить контакт с iPhone?

Я пытаюсь удалить контакт с iPhone, который я создал. Я пытался найти хороший рабочий пример удаления контакта, но не нашел. Добавление контакта казалось довольно простым, но удаление кажется трудным. Следующий код не работает, но кажется правдоподобным:

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

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

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

Кто-нибудь может мне помочь.

Заранее спасибо за помощь.

Максимум

1 ответ

Решение

Проблема в том, что вы создаете ABRecord это не внутри адресной книги. Что вам нужно сделать, это поиск по массиву ABRedordс из ABAddressBook, Я написал, как сделать это для вас:

CFErrorRef error = nil;

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

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

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

//Creates a pass test block to see if the ABRecord has the same name as delete
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) {
        delete = person;
    }
    return (BOOL) pass;
};

int idx = [peopleArray indexOfObjectPassingTest:predicate];

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

Вы можете изменить, как вы хотите сравнить ABRecord экземпляры путем изменения кода блока. Все, что он делает сейчас, сравнивает имена контактов.

Предостережение с этим кодом заключается в том, что он удалит только один экземпляр ABRecordчье имя совпадает delete"S.

Другие вопросы по тегам