颜色集和UIColorAttributeTraitStorage错误

时间:2017-09-26 15:07:13

标签: ios objective-c iphone xcode

我一直在尝试使用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个以上。任何人都可以尝试一下吗?

3 个答案:

答案 0 :(得分:17)

在Xcode 9 Interface Builder中使用新的Color集时遇到了同样的问题。如果您需要支持iOS 10或更早版本,请不要使用Interface Builder中Color set中的任何颜色。

因此,请确保您不要在Interface Builder中选择iPhoneSDK部分上方的任何颜色。

enter image description here

答案 1 :(得分:6)

<强> TL; DR ; 您可能从“最近使用的颜色”下拉列表中选择了一种颜色,该颜色是在您当前使用的项目之外的其他项目中定义的颜色资源。确保在标记为“丢失”的笔尖或故事板中没有任何选定的颜色。

假设您在“项目1”中定义了一个颜色资产,并将其命名为例如“YorkGreen”如下例所示。

该颜色将显示在“最近使用的颜色”下拉列表中,用于所有其他项目。如果您选择它(从“项目1”以外的任何其他项目),加载该视图(笔尖或故事板)时将抛出NSInvalidUnarchiveOperationException,您的应用程序将崩溃。

Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException',
reason: 'Could not instantiate class named _UIColorAttributeTraitStorage'

enter image description here

enter image description here

希望这是一个错误,Xcode 9甚至会显示其他项目中的Color Assets,并且这将在未来的Xcode版本中修复。

答案 2 :(得分:2)

除上述答案外:

不幸的是,没有快速的方法来解决这个问题 - Xcode没有给出一些提示,提示哪些UI元素具有“命名颜色”的颜色。唯一的证据是这个小小的警告:

enter image description here

以下是如何让您的生活更轻松:

  1. 从项目中删除对颜色资源集合的引用

  2. 检查所有.xib文件中的内容

  3. enter image description here

    1. 点击它并转到“其他”选项菜单
    2. enter image description here

      1. 打开“彩色滑块”标签,只需点击任意颜色值
      2. 即可

        enter image description here

        1. 将应用颜色并将其另存为本地值
        2. enter image description here

          解决问题的另一种方法:

          1. 执行上述某个UI元素的步骤。

          2. 检查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"/>
            
          3. 在Atom中打开您的项目或像项目文件夹一样崇高,搜索<color key="textColor" name="name of you color"/>并在任何地方替换