【问题标题】:ABAddressBookSave crashes when adding a kABPersonAddressProperty添加 kABPersonAddressProperty 时,ABAddressBookSave 崩溃
【发布时间】:2014-01-09 02:05:49
【问题描述】:

我正在制作一个需要将联系人保存到地址簿的应用程序。一切正常,除了当我添加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 和电子邮件。

【问题讨论】:

    标签: ios objective-c abaddressbook


    【解决方案1】:

    地址属性不是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);
    

    【讨论】:

    • 好的,这完全有道理,我会试一试。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2016-10-03
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多