在NSMutableArray中存储字符串形式的UIColor无法显示颜色求助
解决字符串形式UIColor转实际对象的问题
嘿,我懂你现在的处境——因为某些原因把UIColor的初始化代码以字符串存在了NSMutableArray里,现在没法直接用这些字符串来显示颜色对吧?这里有两个实用的解决方案,你可以根据自己的需求来选:
方法一:用NSExpression直接解析表达式(简单省心)
NSExpression可以直接解析并执行你这种格式的字符串,返回对应的UIColor实例,代码很简洁:
NSMutableArray *actualColorArr = [NSMutableArray array]; for (NSString *colorStr in bgColorArr) { // 把字符串转成表达式并计算 NSExpression *expression = [NSExpression expressionWithFormat:colorStr]; UIColor *color = [expression expressionValueWithObject:nil context:nil]; if (color) { [actualColorArr addObject:color]; } } // 之后就可以用actualColorArr里的UIColor对象来设置背景色啦
这个方法不需要手动拆分RGB值,系统帮你搞定一切,而且相比直接执行代码的方式更安全,适合你这种自己生成字符串的场景。
方法二:手动解析RGB值(完全可控,安全性更高)
如果你担心表达式执行的风险(比如字符串来源不可信的情况),可以用正则表达式把字符串里的颜色参数提取出来,手动创建UIColor:
NSMutableArray *actualColorArr = [NSMutableArray array]; // 匹配RGB和alpha值的正则表达式 NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"red:(\\d+\\.\\d+) green:(\\d+\\.\\d+) blue:(\\d+\\.\\d+) alpha:(\\d+\\.\\d+)" options:0 error:nil]; for (NSString *colorStr in bgColorArr) { NSTextCheckingResult *match = [regex firstMatchInString:colorStr options:0 range:NSMakeRange(0, colorStr.length)]; if (match && match.numberOfRanges == 5) { // 提取各个颜色分量的浮点值 CGFloat red = [[colorStr substringWithRange:[match rangeAtIndex:1]] floatValue]; CGFloat green = [[colorStr substringWithRange:[match rangeAtIndex:2]] floatValue]; CGFloat blue = [[colorStr substringWithRange:[match rangeAtIndex:3]] floatValue]; CGFloat alpha = [[colorStr substringWithRange:[match rangeAtIndex:4]] floatValue]; // 创建实际的UIColor对象 UIColor *color = [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; [actualColorArr addObject:color]; } }
这种方式完全不会执行任何代码,只是提取数值再初始化,安全性拉满,适合对可控性要求高的场景。
另外提一句:如果之后有机会的话,尽量直接在容器里存储UIColor对象(比如通过NSCoding归档、或者用Core Data存储时设置对应的属性类型),这样就不用再折腾字符串转对象的操作啦。
内容的提问来源于stack exchange,提问作者Madhu
相关产品推荐
相关产品推荐

