1

我使用以下代码将我的“自定义按钮”存储在 NSUserdefaults 中。但是在将对象转换为 NSdata 时出现错误“[UIImage encodeWithCoder:]: unrecognized selector sent to instance”。这里的“自定义按钮”是 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"];
4

3 回答 3

3

NSUserDefaults 类提供方便的方法来访问常见类型,例如浮点数、双精度数、整数、布尔值和 URL。默认对象必须是一个属性列表,即以下实例(或集合实例的组合):NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。如果要存储任何其他类型的对象,通常应该将其归档以创建 NSData 的实例。

不直接映射到属性列表对象的对象NSData通过发送编码器并对其内容进行编码来转换。[UIImage encodeWithCoder:]. 他们需要遵守NSCoding协议才能使其工作。您会发现这UIImage在 iOS 5 之前并不能符合 NSCoding 协议。如果您想在 iOS 5 之前进行部署,您必须自己解决一些问题,方法是在您的自定义按钮类中实现 NSCoding 并以不同的方式存储该图像。

于 2012-04-19T12:00:45.527 回答
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"];
}

更多详情请点击这里

于 2012-04-19T12:07:46.667 回答
1

好吧,稍微搜索一下就会很快给你答案:

UIImage encodeWithCoder 识别选择器?

于 2012-04-19T11:54:43.557 回答