我使用以下代码在NSUserdefaults中存储我的“自定义按钮”。但是我收到错误“[UIImage encodeWithCoder:]:无法识别的选择器发送到实例”,同时将对象转换为NSdata ..其中“自定义按钮”是UIButton类。谁知道为什么......?请帮帮我。
Custom_button *lock11 = (Custom_button*)[menu1 viewWithTag:100];
NSLog(@"opened lock1 ========= %@",lock11);
lock11.is_menu_lock_opened = YES;
NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:lock11]; //[NSKeyedArchiver archivedDataWithRootObject:lock11];
[prefs setObject:myEncodedObject forKey:@"set1lock"];
答案 0 :(得分:3)
NSUserDefaults类提供了便于访问的方法 常见类型,例如浮点数,双精度数,整数,布尔值和URL。一个 默认对象必须是属性列表,即(或 对于集合的实例组合):NSData,NSString, NSNumber,NSDate,NSArray或NSDictionary。如果你想存储任何 在其他类型的对象中,通常应将其存档以创建 NSData的实例。
不直接映射到属性列表对象的对象通过发送编码器并编码其内容而变为NSData
。 [UIImage encodeWithCoder:]
。他们需要符合NSCoding
协议才能实现这一目标。在iOS 5之前,你会发现UIImage
没有确认NSCoding协议。如果你想在iOS 5之前部署,你必须自己解决问题,在自定义按钮类中实现NSCoding并将其存储在另一种方式。
答案 1 :(得分:2)
将此方法实现到Custom_button类
中所有对象的initWithCoder和encodeWithCoder
-(id) initWithCoder: (NSCoder *)coder {
self = [[CastInnerListData alloc] init];
if (self != nil) {
self.object1 = [coder decodeObjectForKey:@"object1"];
self.object2 = [coder decodeObjectForKey:@"object2"];
}
return self;
}
-(void) encodeWithCoder: (NSCoder *)coder{
[coder encodeObject:object1 forKey:@"object1"];
[coder encodeObject:object2 forKey:@"object2"];
}
答案 2 :(得分:1)
好一点搜索就能快速给你答案: