【问题标题】:UIDatePicker crash on iOS 14 while setting `textColor` via KVC通过 KVC 设置“textColor”时,UIDatePicker 在 iOS 14 上崩溃
【发布时间】:2020-07-09 17:47:35
【问题描述】:

在我的应用程序中,我使用带有自定义文本颜色的 UIDatePicker,并且在 iOS 12/13 上,此代码可以正常工作:

timePicker.setValue(UIColor.red, forKeyPath: "textColor")

但在 iOS 14 上,我的应用崩溃了。

堆栈跟踪:

-[_UIDatePickerIOSCompactView _setTextColor:]: unrecognized selector sent to instance 0x7ff09265a8c0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_UIDatePickerIOSCompactView _setTextColor:]: unrecognized selector sent to instance 0x7ff09265a8c0'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000011b0eea2a __exceptionPreprocess + 242
    1   libobjc.A.dylib                     0x000000011aa004ce objc_exception_throw + 48
    2   CoreFoundation                      0x000000011b0fd579 +[NSObject(NSObject) instanceMethodSignatureForSelector:] + 0
    3   UIKitCore                           0x00000001235db925 -[UIResponder doesNotRecognizeSelector:] + 292
    4   CoreFoundation                      0x000000011b0f2cf4 ___forwarding___ + 859
    5   CoreFoundation                      0x000000011b0f4f98 _CF_forwarding_prep_0 + 120
    6   Foundation                          0x0000000110c0a6ae -[NSObject(NSKeyValueCoding) setValue:forKey:] + 325
    7   UIKitCore                           0x0000000123af85c5 -[UIView(CALayerDelegate) setValue:forKey:] + 171

有人知道如何在 iOS 14+ 上使用自定义文本颜色吗?

【问题讨论】:

  • 仅供参考stackoverflow.com/a/39553039/1801544 以防万一。如果您能看到一些隐藏的值,您可能需要检查调试器。但这可能是在未来稳定的 iOS14 版本中解决的临时错误。

标签: ios swift uikit uidatepicker ios14


【解决方案1】:

在 swift 中使用 KVC 是不安全的,因为如果缺少密钥,您的应用程序将会崩溃。 为了改变 UIDatePicker 中文本的颜色,使用属性 tintColor。

var picker = UIDatePicker()
picker.tintColor = UIColor.blue

【讨论】:

    【解决方案2】:

    这可能仅适用于preferredDatePickerStyle = .wheels

    所以你可以在下面添加这个检查

         if #available(iOS 13.4, *) {
            <yourPickerview>.preferredDatePickerStyle = .wheels
        } else {
            // Fallback on earlier versions
        }
    

    【讨论】:

      【解决方案3】:

      正如我在 Larme 链接的答案中回答的那样,textColorUIDatePicker 的私有财产。无法保证它会存在于任何版本的 iOS 中,因此您所做的事情并不安全。

      KVC 允许您在不进行任何编译时检查的情况下尝试更改对象的属性,因此如果属性被删除,您就会崩溃。

      【讨论】:

      • 我知道这不安全。但我的目标是为系统日期选择器使用自定义 UI。
      • @RobotBender 最安全的方法是创建自己的 UIDatePicker,否则每次 iOS 更新都可能崩溃。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      相关资源
      最近更新 更多