无法找到呈现视图控制器 - 覆盖中的 UIDatePicker

Failed to find a presenting view controller - UIDatePicker in overlay

我正在使用以下代码呈现叠加视图(通过将其作为子视图添加到 window):

@objc func show() {
    if let window = UIApplication.shared.keyWindow {
        setupBlackView(window: window)
        setupSelf(window: window)
        window.addSubview(blackView)
        window.addSubview(self)
        UIView.animate(withDuration: 0.2, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
            self.blackView.alpha = 1
            if let height = self.percentageHeight {
                self.frame = CGRect(x: 0, y: (1-height) * window.frame.height, width: screenWidth, height: screenHeight * height)
            }
        }, completion: nil)
    }
}

叠加视图包含 UIDatePicker。这段代码过去工作正常。但是,现在我看到以下错误:

[Assert] Failed to find a presenting view controller for view (<_UIDatePickerIOSCompactView: 0x7fe8003288e0; frame = (0 0; 114 188.333); gestureRecognizers = <NSArray: 0x600003bca3d0>; layer = <CALayer: 0x600003025a80>>) in window (<UIWindow: 0x7fe7fc436010; frame = (0 0; 390 844); autoresize = W+H; gestureRecognizers = <NSArray: 0x6000038918f0>; layer = <UIWindowLayer: 0x60000367d5c0>>). The interaction's view (or an ancestor) must have an associated view controller for presentation to work.

UIDatePicker 看起来坏了:

您似乎想要构建一个可以在应用程序中随处使用的 DatePicker 控件。你能做的是,

  1. 从 UIWindow 创建具有更高 Z-index 的派生 class,检查 here
  1. 从 UIViewController 创建派生的 class 并使用您喜欢的任何 UI 自定义添加您的 datePicker 控件。

  2. 接下来将您在点 2 中创建的视图控制器作为您在点 1

    中创建的 window 的根ViewController
  3. 现在,每次要显示日期选择器时,将 window 作为键 Window。由于 UIWindow 是从 UIView class 继承的,因此可以按照您想要的方式对其进行动画处理,并且您的动画 DatePicker 是从头开始构建的。

P.S 您也可以将其发布为 CocoaPod。 ;)

iOS14介绍了UIDatePicker实例属性datePickerStyle{get}和preferredDatePickerStyle{set get}。您的“损坏的” UIDatePicker 似乎是新样式之一。如果您期待“轮子”外观,请尝试将 perferredDatePickerStyle 属性 设置为 UIDatePickerStyle.wheels。这可能会导致您的错误,因为日期选择器紧凑视图将与 UTDatePickerStyle.compact 样式相关联。