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

Posted

技术标签:

【中文标题】无法找到呈现视图控制器 - 覆盖中的 UIDatePicker【英文标题】:Failed to find a presenting view controller - UIDatePicker in overlay 【发布时间】:2021-06-04 22:35:04 【问题描述】:

我正在使用以下代码呈现覆盖视图(通过将其作为子视图添加到 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 看起来坏了:

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

    从 UIWindow 创建一个具有更高 Z-index 的派生类,检查 here

    从 UIViewController 创建一个派生类,并使用您喜欢的任何 UI 自定义添加您的 datePicker 控件。

    接下来将您在第 2 点创建的视图控制器作为您在第 1 点创建的窗口的 rootViewController

    现在,每次要显示 datePicker 时,都将窗口设为 keyWindow。由于 UIWindow 是从 UIView 类继承的,因此可以按照您想要的方式对其进行动画处理,并且您的精彩动画 DatePicker 是从头开始构建的。

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

【讨论】:

以上是关于无法找到呈现视图控制器 - 覆盖中的 UIDatePicker的主要内容,如果未能解决你的问题,请参考以下文章

从 SubView 呈现模态 ViewController

在不覆盖 iPhone 上的当前视图的情况下呈现模态视图控制器

在动画呈现控制器视图的同时动画呈现控制器视图

与父级不同,从 iMessage 应用程序呈现的视图控制器被 iMessage 顶栏覆盖

使用故事板从应用程序委托呈现模态视图控制器

无法呈现/推送另一个视图控制器