如何使我在通讯簿中为自定义属性设置的值保留



我在地址簿中创建了一个名为"Qref"的自定义属性。我可以使用[ABPerson properties]检查它是否存在,并且它始终存在于我编写的任何测试应用程序中。

顺便说一下,您无法删除自定义属性,因为尚未实现[ABPerson removeProperties]。让我知道它是否曾经是,因为我需要删除我输入错误名称的人。

我用这段代码设置了一个属性值。

ABPerson *p = <person chosen from a PeoplePicker>;
NSError *e;
if (![p setValue: aString forProperty:@"Qref" error:&e]) {
  [NSAlert alertWithError:e]runModal;
}

(我从未见过警报,但有时会在控制台中收到大量错误消息。此时,我可以离开人员选取器中的人员,然后返回以查找正确设置的值。如果我检查[[ABAddressBook sharedAddressBook] hasUnsavedChanges]结果是否定的,所以显然更改自定义属性值不算作更改,所以我通过插入虚拟人(请建议更好的方法)来强制保存,然后执行

[[ABAddressBook sharedAddressBook] save];

如果虚拟人正在运行,它会立即出现在地址簿中,所以有些事情是正确的。但是当我关闭我的应用程序并再次运行它时,我发现我设置的值已经消失了。(MacOSX-Lion)

我一直在

错误的树上吠叫。事实证明,我无法保存任何属性,无论它们是否是自定义属性。然后我想知道这是否与代码签名、权利或 iCloud 有关,这对我来说是不可穿透的丛林。似乎您从PeoplePicker获得的人与任何地址簿都没有关联,因此[[ABAddressBook sharedAddressBook] save]什么都不会做。你必须从ABAddressBook实例中获取你的人。这是有效的框架,没有任何错误检查。

ABPerson *p = [[myPeoplePicker selectedRecords] objectAtIndex:0];
NSString *uid = p.uniqueId;
ABPerson *editablePerson = 
     (ABPerson*) [[ABAddressBook sharedAddressBook] recordForUniqueId:uid];
// Typecast because it returns an ABRecord. Can anyone improve?
[editablePerson setValue:@"ABCD" forProperty:@"Qref"]; // my custom property
[[ABAddressBook sharedAddressBook] save];

最新更新