macos - 如何才能保留为 AddressBook 中的自定义属性设置的值?

标签 macos cocoa osx-lion addressbook

我在 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-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];

关于macos - 如何才能保留为 AddressBook 中的自定义属性设置的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10097179/

相关文章:

c++ - OSX AUGraph 重新创建导致 badComponentType 错误

objective-c - NSTask的标准输出可以用来生成xml文件吗

objective-c - 使用 NSComboBox 进行 Cocoa 绑定(bind)

R 3.1.3 升级后,R cmd 检查在 mac 上找不到 texi2pdf

objective-c - Xcode 4 内置帮助您自己的文件

c++ - 由于架构 x86_64 的符号未定义,GLFW 的最小示例失败

iphone - 为什么 Core Data 创建带有属性但没有伴随实例变量的 NSManagedObject?

ios - Xcode 4.5.2 在 Mac OS X Mountain Lion 上不断崩溃?

macos - 我可以使用哪些方法从 OS X Lion 的命令行 growl ?

xcode - Mac OS X Lion : can not install mysql-python 上缺少 llvm-gcc