iOS12运行自定义UILabel报错 boldColor不符合键值编码规范
问题原因
- 核心原因是你给只读计算属性
boldColor添加了@IBInspectable修饰。iOS 12的Interface Builder解析逻辑会尝试通过KVC对所有@IBInspectable修饰的属性赋值,但只读计算属性没有实现setter方法,就会触发NSUnknownKeyException崩溃。iOS 13及以上系统对只读的@IBInspectable属性做了兼容处理,不会主动赋值,所以运行正常。 - 次要隐患:
boldColor中用到的userInterfaceStyle是iOS 13才推出的API,iOS 12设备调用会触发找不到selector的崩溃,这个问题在你修复第一个异常后就会暴露。
解决步骤
- 移除
boldColor的@IBInspectable修饰。这个属性是内部用来动态适配暗黑模式颜色的,不需要在IB面板中配置,完全没必要加这个修饰符。 - 给暗黑模式相关的代码加上系统版本判断,iOS 12及以下版本没有暗黑模式,直接返回浅色模式对应的颜色即可。
修改后的boldColor参考代码:
// 去掉@IBInspectable修饰 var boldColor: UIColor { if #available(iOS 13.0, *) { return traitCollection.userInterfaceStyle == .light ? .black : .white } else { // iOS12及以下没有暗黑模式,直接返回浅色模式颜色 return .black } }
额外提醒:你代码里的
fontSize、fontType也是加了@IBInspectable修饰的只读计算属性,同样会在iOS 12设备上触发崩溃,建议一起移除对应的@IBInspectable修饰,不需要在IB配置的属性不要加该修饰符。如果确实需要暴露到IB面板配置,就把属性改成带默认值的存储属性即可。
内容的提问来源于stack exchange,提问作者eloka
相关产品推荐
相关产品推荐

