在我的iPhone应用程序中,我有一个名为Contact
的类,它由ABRecordRef
组成,用作对特定联系人的引用。将数据存储到NSUserDefaults
我需要将这些联系人的组存储在NSUserDefaults
中,但由于Contact
是一个自定义类,所以事情并不奏效。
任何想法在这种情况下做什么?
在我的iPhone应用程序中,我有一个名为Contact
的类,它由ABRecordRef
组成,用作对特定联系人的引用。将数据存储到NSUserDefaults
我需要将这些联系人的组存储在NSUserDefaults
中,但由于Contact
是一个自定义类,所以事情并不奏效。
任何想法在这种情况下做什么?
您不能将NSUserDefaults
用于自定义类。从文档:
的
NSUserDefaults
类提供用于访问 常见类型如浮标方便的方法,双打,整数,布尔值,和URL。甲 缺省对象必须是一个属性列表,也就是,的一个实例(用于集合或 的实例的组合):NSData
,NSString
,NSNumber
,NSDate
,NSArray
,或者NSDictionary
。如果要存储任何其他类型的对象,则通常应将其归档,以创建NSData
的实例 。
尝试使用NSData
。例如,自定义对象加载到一个数组,你可以做
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"savedArray"];
if (dataRepresentingSavedArray != nil)
{
NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
if (oldSavedArray != nil)
objectArray = [[NSMutableArray alloc] initWithArray:oldSavedArray];
else
objectArray = [[NSMutableArray alloc] init];
}
要存档的数据,使用:
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:objectArray] forKey:@"savedArray"];
这将所有的工作,只要你自定义对象与NSCoding
协议规定:
- (void)encodeWithCoder:(NSCoder *)coder;
{
[coder encodeObject:label forKey:@"label"];
[coder encodeInteger:numberID forKey:@"numberID"];
}
- (id)initWithCoder:(NSCoder *)coder;
{
self = [[CustomObject alloc] init];
if (self != nil)
{
label = [coder decodeObjectForKey:@"label"];
numberID = [coder decodeIntegerForKey:@"numberID"];
}
return self;
}
ABRecord
是不透明C型,所以它不是在Objective-C的读出的对象。这意味着您无法扩展它,您无法在其上添加类别,也无法向其发送消息。您可以做的唯一事情就是拨打ABRecord
中所述的呼叫功能,并以ABRecord
作为参数。
你可以做两件事情能够保持在ABRecord
周围引用的信息:
找ABRecordGetRecordID()
的ABRecord
小号id
。 ABRecordID
被定义为int32_t,因此您可以将其转换为NSInteger
并将其存储在任何地方。您可以稍后从ABAddressBookGetPersonWithRecordID()
或ABAddressBookGetGroupWithRecordID()
获取记录。但是,记录可能会被用户或其他应用程序更改或甚至删除。
将记录内的所有值复制到标准NSObject
子类中,并使用NSCoding
来存储它。当然,您将不会从用户可能做出的记录更改或添加中受益。
ABRecordRef似乎是一个const void *
,所以其存储在NSUserDefaults
,你必须把它包在NSData
:NSData *d = [[NSData alloc] initWithBytes:thePointer length:sizeof(ABRecordRef)];
。
是的,但我如何存储ABRecordRef,因为它不是一个明显的对象 – CodeGuy
你知道它至少是什么?对象,结构,基类型? – 2011-07-14 16:58:38
那么,Apple's recommendation是存储记录标识符,名字和姓氏。然后,您可以尝试通过标识符从地址簿中检索联系人,如果未找到该记录或者如果该记录不是合适的人,请尝试按姓氏和名字进行检索(因为记录标识符可能会根据您的来源地址簿数据)。
这可能是也可能不是你想要的,这取决于你存储数据的原因。但是,你可以很容易地将这三个值放入NSDictionary中,并将字典写入NSUserDefaults
。
实际上,您可以使用转换为vCard表示形式(即CFStringRef)将其存储,该表示形式可以轻松用作NSString。
但我不能编码ABRecordRef,因为它不是一个对象。 – CodeGuy
对,我做到了。但我如何编码ABRecordRef – CodeGuy
@ reising1:请参阅上文。 – PengOne