iOS/Objective-C:从NSUserDefaults读取的UIColor转CGColor失败问题
解决NSUserDefaults读取UIColor转CGColor失败的问题
首先得揪出问题根源:NSUserDefaults本身不支持直接存储UIColor对象,它只认plist兼容的类型(比如NSString、NSNumber、NSArray、NSDictionary、NSData这些)。如果你之前存颜色的时候没做正确的归档处理,那从NSUserDefaults取出来的myColor要么是nil,要么根本不是有效的UIColor实例,这时候调用CGColor方法自然会失败。
第一步:先确保存储UIColor的方式是正确的
存颜色的时候,得把UIColor归档成NSData再存入NSUserDefaults:
// 要存储的目标颜色 UIColor *colorToSave = [UIColor greenColor]; // 将UIColor归档为NSData格式 NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:colorToSave requiringSecureCoding:NO error:nil]; // 存入NSUserDefaults [[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"myColorKey"]; // 同步生效(可选,但建议加上确保立即写入) [[NSUserDefaults standardUserDefaults] synchronize];
第二步:读取时正确解档并转换为CGColor
读取的时候需要先把NSData解档回UIColor,再调用CGColor方法:
// 取出存储的NSData NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColorKey"]; // 解档为UIColor对象 UIColor *myColor = [NSKeyedUnarchiver unarchivedObjectOfClass:[UIColor class] fromData:colorData error:nil]; CGColorRef circleColor = nil; if (myColor) { // 读取到有效UIColor时,直接转换为CGColor circleColor = myColor.CGColor; } else { // 读取失败时用默认颜色兜底,避免崩溃 circleColor = [UIColor greenColor].CGColor; }
你代码里的小细节坑
另外注意看你写的代码:[[NSUserDefaults standardUserDefaults] objectForKey:myColor];这里的myColor应该是字符串类型的key(比如@"myColor"),不然会因为类型错误取不到正确的值,这也是可能导致问题的原因之一。还有[[myColor] CGColor]这个写法是语法错误,正确的调用是[myColor CGColor]或者用点语法myColor.CGColor,但前提是myColor是有效的UIColor实例。
内容的提问来源于stack exchange,提问作者user6631314
相关产品推荐
相关产品推荐

