我一直在尝试使用Xcode 9编写适用于iOS11 iOS9.0兼容的应用程序,并且突然在iPhone 4S上出现此错误:
*** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named _UIColorAttributeTraitStorage'
同样的项目在iPhone 7上运行良好。
我已经改变了所有[UIColor colorNamed:],正如Xcode建议的那样:
if (@available(iOS 11.0, *)) {
statusBar.backgroundColor = [UIColor colorNamed:@"MyColor"];
} else {
statusBar.backgroundColor = kColorFromHex(0x509E2F);
}
但这个错误并没有发生。我还没有在Apple文档或网络上的任何地方找到任何提及UIColorAttributeTraitStorage的内容,除了一些日语(?)post。我在这篇文章中理解的是,有人可能在iOS 10.3和Xcode 9中遇到了与Color Set相同的问题。
所以似乎问题出现在包含颜色集的xcassets中。这是否意味着颜色集没有向后兼容性?如果我添加一个没有办法将我的应用程序分发给低于11.0的iOS?
P.S。:我没有任何iOS 10设备,所以我不知道自Xcode 9公开发布以来该问题是否还有10个以上。任何人都可以尝试一下吗?
答案 0 :(得分:17)
在Xcode 9 Interface Builder中使用新的Color集时遇到了同样的问题。如果您需要支持iOS 10或更早版本,请不要使用Interface Builder中Color set中的任何颜色。
因此,请确保您不要在Interface Builder中选择iPhoneSDK
部分上方的任何颜色。
答案 1 :(得分:6)
<强> TL; DR 强>; 您可能从“最近使用的颜色”下拉列表中选择了一种颜色,该颜色是在您当前使用的项目之外的其他项目中定义的颜色资源。确保在标记为“丢失”的笔尖或故事板中没有任何选定的颜色。
假设您在“项目1”中定义了一个颜色资产,并将其命名为例如“YorkGreen”如下例所示。
该颜色将显示在“最近使用的颜色”下拉列表中,用于所有其他项目。如果您选择它(从“项目1”以外的任何其他项目),加载该视图(笔尖或故事板)时将抛出NSInvalidUnarchiveOperationException
,您的应用程序将崩溃。
Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException',
reason: 'Could not instantiate class named _UIColorAttributeTraitStorage'
希望这是一个错误,Xcode 9甚至会显示其他项目中的Color Assets,并且这将在未来的Xcode版本中修复。
答案 2 :(得分:2)
除上述答案外:
不幸的是,没有快速的方法来解决这个问题 - Xcode没有给出一些提示,提示哪些UI元素具有“命名颜色”的颜色。唯一的证据是这个小小的警告:
以下是如何让您的生活更轻松:
从项目中删除对颜色资源集合的引用
检查所有.xib文件中的内容
解决问题的另一种方法:
执行上述某个UI元素的步骤。
检查Git,你会看到这样的变化
- <color key="textColor" name="name of you color"/>
+ <color key="titleColor" red="r.rr" green="g.gg" blue="b.bb" alpha="1" colorSpace="calibratedRGB"/>
在Atom中打开您的项目或像项目文件夹一样崇高,搜索<color key="textColor" name="name of you color"/>
并在任何地方替换