Я использую ABAddressBook, я могу отображать каждый контакт, но у меня есть дублированный контакт.Дублированный контакт с ABAddressBook
Я читал эту тему: Dealing with duplicate contacts due to linked cards in iOS' Address Book API, но не может решить проблему.
Я хотел бы использовать этот код в шахте, но я не удается ..:
NSMutableSet *unifiedRecordsSet = [NSMutableSet set];
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef records = ABAddressBookCopyArrayOfAllPeople(addressBook);
for (CFIndex i = 0; i < CFArrayGetCount(records); i++)
{
NSMutableSet *contactSet = [NSMutableSet set];
ABRecordRef record = CFArrayGetValueAtIndex(records, i);
[contactSet addObject:(__bridge id)record];
NSArray *linkedRecordsArray = (__bridge NSArray *)ABPersonCopyArrayOfAllLinkedPeople(record);
[contactSet addObjectsFromArray:linkedRecordsArray];
// Your own custom "unified record" class (or just an NSSet!)
DAUnifiedRecord *unifiedRecord = [[DAUnifiedRecord alloc] initWithRecords:contactSet];
[unifiedRecordsSet addObject:unifiedRecord];
CFRelease(record);
}
CFRelease(records);
CFRelease(addressBook);
_unifiedRecords = [unifiedRecordsSet allObjects];
Вот мой код:
- (void)getPersonOutOfAddressBook
{
//1
CFErrorRef error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
if (addressBook != nil) {
NSLog(@"Succesful.");
//2
NSArray *allContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
//3
NSUInteger i = 0; for (i = 0; i < [allContacts count]; i++)
{
Person *person = [[Person alloc] init];
ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
//4
NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson,
kABPersonFirstNameProperty);
if (firstName == nil)
{
firstName = @"";
}
NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonLastNameProperty);
if (lastName == nil)
{
lastName = @"";
}
NSString *fullName = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
person.firstName = firstName; person.lastName = lastName;
person.fullName = fullName;
//phone
//5
ABMultiValueRef phones = ABRecordCopyValue(contactPerson, kABPersonPhoneProperty);
//6
NSUInteger j = 0;
for (j = 0; j < ABMultiValueGetCount(phones); j++) {
NSString *phone = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(phones, j);
if (j == 0) {
person.mainNumber = phone;
}
else if (j==1) person.secondNumber = phone;
}
//7
[person.mainNumber stringByReplacingOccurrencesOfString:@" " withString:@""];
[person.mainNumber stringByReplacingOccurrencesOfString:@"(" withString:@""];
[person.mainNumber stringByReplacingOccurrencesOfString:@")" withString:@""];
[person.mainNumber stringByReplacingOccurrencesOfString:@"+336" withString:@"06"];
[self.tableData addObject:person];
[self.contact addObject:person.fullName];
}
//8
CFRelease(addressBook);
} else {
//9
NSLog(@"Error reading Address Book");
}
NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"fullName" ascending:YES];
[self.tableData sortUsingDescriptors:[NSArray arrayWithObject:sorter]];
}
Несвязанный, но если вы исправили некоторые утечки памяти оригинала, но представили один из своих: вы должны «CFRelease (phones)». Кроме того, вы делаете некоторые замены строк в главном номере телефона, но ничего не делаете с этими заменами, отбрасывая их. Если вы хотите это сделать, изменчивая строка, вероятно, имеет смысл. – Rob
@Rob У меня снова возникли проблемы, я использовал self.contact (NSMutableArray) для добавления только fullName для сортировки с разделами. Я обновляю свой код, чтобы показать вам это. Я не знаю, как исправить только с помощью self.tableData в ViewDidLoad. Мне нужно получить доступ только к person.fullName для localizedCaseInsensitiveCompare – Viny76
@ Rob Хорошо, сделано. Большое спасибо за Вашу помощь !!! – Viny76