2014-01-08 1 views
1

Я создаю приложение, в котором мне нужно сохранить контакт в адресной книге. Все работает отлично, за исключением случаев, когда я добавляю kABPersonAddressProperty, сначала добавляю их, затем я сохраняю адрес, и он падает при сохранении.ABAddressBookSave сбой при добавлении kABPersonAddressProperty

Ошибки я получаю:

-[__NSCFString count]: unrecognized selector sent to instance 0x99e6f30 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString count]: unrecognized selector sent to instance 0x99e6f30' 

Вот код, который я использую:

ABRecordRef aRecord = ABPersonCreate(); 
CFErrorRef anError = NULL; 
// 
//some code here, not relevant 
// 
ABMutableMultiValueRef multiAdd = ABMultiValueCreateMutable(kABMultiStringPropertyType); 
ABMultiValueAddValueAndLabel(multiAdd, (__bridge CFStringRef)self.Street.text, kABPersonAddressStreetKey, NULL); 
ABMultiValueAddValueAndLabel(multiAdd, (__bridge CFStringRef)self.ZIPcode.text, kABPersonAddressZIPKey, NULL); 
ABMultiValueAddValueAndLabel(multiAdd, (__bridge CFStringRef)self.City.text, kABPersonAddressCityKey, NULL); 

ABRecordSetValue(aRecord, kABPersonAddressProperty, multiAdd, &anError); 
CFRelease(multiAdd); 

//More irrelevant code here 


ABAddressBookRef addressBook; 
CFErrorRef error = NULL; 
addressBook = ABAddressBookCreateWithOptions(nil, NULL); 

BOOL isAdded = ABAddressBookAddRecord (addressBook, aRecord, &error); 

if(isAdded){ 
    NSLog(@"added.."); 
} 
if (error != NULL) { 
    NSLog(@"ABAddressBookAddRecord %@", error); 
} 

error = NULL; 

BOOL isSaved = ABAddressBookSave (addressBook, &error); 

Всякий раз, когда я запускаю этот код, ошибка всегда NULL, и isAdded всегда true, но все же он сбой во время выполнения ABAddressBookSave(addressBook,&error); . Еще одна важная вещь: если я удалю эту часть кода:

ABMutableMultiValueRef multiAdd = ABMultiValueCreateMutable(kABMultiStringPropertyType); 
ABMultiValueAddValueAndLabel(multiAdd, (__bridge CFStringRef)self.Street.text, kABPersonAddressStreetKey, NULL); 
ABMultiValueAddValueAndLabel(multiAdd, (__bridge CFStringRef)self.ZIPcode.text, kABPersonAddressZIPKey, NULL); 
ABMultiValueAddValueAndLabel(multiAdd, (__bridge CFStringRef)self.City.text, kABPersonAddressCityKey, NULL); 

ABRecordSetValue(aRecord, kABPersonAddressProperty, multiAdd, &anError); 
CFRelease(multiAdd); 

Контакт прекрасен, с именем, фамилией, несколькими телефонными номерами, URL-адресом и электронной почтой.

ответ

2

Адресное свойство не является kABMultiStringPropertyType, но вместо этого является kABMultiDictionaryPropertyType.

Чтобы решить проблему, попробуйте изменить ваш звонок на ABMultiValueCreateMutable, передав его правильному типу, kABMultiDictionaryPropertyType.

И тогда вам также нужно будет обновить информацию о том, как вы заполняете информацию о адресе, создавая словарь из значений адресной строки. Посмотрите пример this post.

Это должно выглядеть примерно так (непроверенные):

ABMultiValueRef addresses = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType); 
    NSDictionary *values = [NSDictionary dictionaryWithObjectsAndKeys: 
           self.Street.text, (NSString *)kABPersonAddressStreetKey, 
           self.ZIPcode.text, (NSString *)kABPersonAddressZIPKey, 
           self.City.text, (NSString *)kABPersonAddressCityKey, 
           nil]; 

ABMultiValueAddValueAndLabel(addresses, (CFDictionaryRef)values, kABHomeLabel, NULL); 
ABRecordSetValue(aRecord, kABPersonAddressProperty, addresses, &anError); 
+0

Ok, это вполне имеет смысл, я собираюсь дать ему попробовать. Приветствия. – Alejandro

+0

Он отлично работает, спасибо. – Alejandro