2012-05-16 4 views
2

내가 만든 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); 

누구든지 도와 줄 수 있습니까?

미리 도움을 주셔서 감사합니다.

최대

답변

8

이 문제는 주소록의 내부가 아닌 ABRecord를 만드는 것입니다. 당신이해야 할 일은 ABAddressBook에서 ABRedord의 배열을 검색하는 것입니다.

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 인스턴스를 비교하는 방법을 변경할 수 있습니다 당신을 위해이 작업을 수행하는 방법을 썼다. 지금하고있는 일은 연락처의 이름을 비교하는 것뿐입니다.

이 코드가있는주의 사항은 delete과 일치하는 ABRecord의 인스턴스 하나만 삭제한다는 것입니다.

+2

그것은 매력처럼 작동했습니다. 제 질문에 대답하고 저에게 소스 코드를 제공 할 시간을 가져 주셔서 감사합니다. – Max

관련 문제