无法找到呈现视图控制器 - 覆盖中的 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的主要内容,如果未能解决你的问题,请参考以下文章
在不覆盖 iPhone 上的当前视图的情况下呈现模态视图控制器