0

我在 AddressBook 中创建了一个名为“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;
}

(我还没有看到警报,但有时会在控制台中收到一堆错误消息。)此时我可以离开 PeoplePicker 中的人并返回以找到正确设置的值。如果我检查[[ABAddressBook sharedAddressBook] hasUnsavedChanges]结果为否,那么显然更改自定义属性值不算作更改,所以我通过插入虚拟人来强制保存(请提出更好的方法),然后执行

[[ABAddressBook sharedAddressBook] save];

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

4

1 回答 1

1

我一直在叫错树。事实证明,我无法保存任何属性,无论它们是否是自定义属性。然后我想知道这是否与代码签名、权利或 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];
于 2012-04-21T13:21:37.897 回答