未为 UIColor 定义哈希 UIPlaceholderColor 需要先转换颜色空间

Posted

技术标签:

【中文标题】未为 UIColor 定义哈希 UIPlaceholderColor 需要先转换颜色空间【英文标题】:hash not defined for the UIColor UIPlaceholderColor need to first convert colorspace 【发布时间】:2018-12-27 11:47:16 【问题描述】:

我有一个部分使用 Swift 3.2 编写的应用程序和使用 xcode 10 构建的 Objective-c,我在一些 Swift ViewControllers 中发生了奇怪的崩溃,在我收集的日志中,发生的那一行是我在 UILabel 上设置文本 (valueLabel.text = "-")(UILabel 是普通的,没有继承也没有任何自定义)。

Fatal Exception: NSInvalidArgumentException
0  CoreFoundation                 0x212368ec4 __exceptionPreprocess
1  libobjc.A.dylib                0x211539a40 objc_exception_throw
2  CoreFoundation                 0x21226f594 -[NSCache init]
3  UIKitCore                      0x23f14fba0 (Missing)
4  UIKitCore                      0x23f14fc3c (Missing)
5  UIFoundation                   0x21c9ca778 attributeDictionaryHash
6  Foundation                     0x212dc8074 hashProbe
7  Foundation                     0x212ce5c24 -[NSConcreteHashTable getItem:]
8  UIFoundation                   0x21c975548 +[NSAttributeDictionary newWithDictionary:]
9  UIFoundation                   0x21c9778e4 -[_NSCachedAttributedString initWithString:attributes:]
10 UIFoundation                   0x21c9e5b98 __NSStringDrawingEngine
11 UIFoundation                   0x21c9697e4 -[NSString(NSExtendedStringDrawing) boundingRectWithSize:options:attributes:context:]
12 UIKitCore                      0x23f90c9a0 (Missing)
18 ole-consignado                 0x100e336ac $S14test_app18CardViewControllerC11resetLayout33_2E2D3FEF56CDB4998F73949398E4FE67LLyyF (CardViewController.swift:103)
19 ole-consignado                 0x100e327b4 $S14test_app18CardViewControllerC17viewWillDisappearyySbF (CardViewController.swift:73)
20 ole-consignado                 0x100e32804 $S14test_app18CardViewControllerC17viewWillDisappearyySbFTo (<compiler-generated>)
21 UIKitCore                      0x23ef39068 (Missing)
43 CoreFoundation                 0x2122f87cc __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__
44 CoreFoundation                 0x2122f3460 __CFRunLoopDoObservers
45 CoreFoundation                 0x2122f3a00 __CFRunLoopRun
46 CoreFoundation                 0x2122f31f0 CFRunLoopRunSpecific
47 GraphicsServices               0x21456c584 GSEventRunModal
48 UIKitCore                      0x23f4fad40 (Missing)
49 ole-consignado                 0x100b37f74 main (main.m:14)
50 libdyld.dylib                  0x211db2bb4 start

所以我的问题是任何人以前遇到过这种崩溃并有解决方案建议?

【问题讨论】:

【参考方案1】:

每当您通过 UIColor.init 实例化 UIColor 时,都会生成一个 UIPlaceholderColor 实例,该实例不带任何参数。关于这一点的事情是它在 UIKit 的语义中是完全有效的,并且可能导致它显示为 UIColor.clear

突破点是尝试将它与 CoreGraphics 语义一起使用。 UIPlaceholderColor 的底层存储没有颜色空间和任何颜色值存储,因此无法使用cgColor getter 将其转换为 CGColor。 hash getter 也是如此。

您如何解决这种情况?确定您在哪里调用 UIColor.init 并将其替换为 UIColor.clear,这将很容易转换为 CGColor。

【讨论】:

这真的很有用。谢谢你。我有一些 UIColor() 初始化实例,它们在 ios13 中没有引起任何问题,* 但会在 ios12 上莫名其妙地崩溃。你节省了我的时间和精力?

以上是关于未为 UIColor 定义哈希 UIPlaceholderColor 需要先转换颜色空间的主要内容,如果未能解决你的问题,请参考以下文章

未为类型定义运算符“[]”尝试定义运算符“[]”

getcontentresolver() 未为该类型定义

未为“对象”类型定义运算符“[]”[重复]

Flutter:未为 DataSnapshot 类定义 forEach 方法

收到错误:未为 appium 定义名称“webdriver”

未捕获的 ReferenceError:未为 Ionic Push 定义 Ionic