无法找到呈现视图控制器 - 覆盖中的 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 控件。你能做的是,
- 从 UIWindow 创建具有更高 Z-index 的派生 class,检查 here
从 UIViewController 创建派生的 class 并使用您喜欢的任何 UI 自定义添加您的 datePicker 控件。
接下来将您在点 2 中创建的视图控制器作为您在点 1
中创建的 window 的根ViewController
现在,每次要显示日期选择器时,将 window 作为键 Window。由于 UIWindow 是从 UIView class 继承的,因此可以按照您想要的方式对其进行动画处理,并且您的动画 DatePicker 是从头开始构建的。
P.S 您也可以将其发布为 CocoaPod。 ;)
iOS14介绍了UIDatePicker实例属性datePickerStyle{get}和preferredDatePickerStyle{set get}。您的“损坏的” UIDatePicker 似乎是新样式之一。如果您期待“轮子”外观,请尝试将 perferredDatePickerStyle 属性 设置为 UIDatePickerStyle.wheels。这可能会导致您的错误,因为日期选择器紧凑视图将与 UTDatePickerStyle.compact 样式相关联。
我正在使用以下代码呈现叠加视图(通过将其作为子视图添加到 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 控件。你能做的是,
- 从 UIWindow 创建具有更高 Z-index 的派生 class,检查 here
从 UIViewController 创建派生的 class 并使用您喜欢的任何 UI 自定义添加您的 datePicker 控件。
接下来将您在点 2 中创建的视图控制器作为您在点 1
中创建的 window 的根ViewController现在,每次要显示日期选择器时,将 window 作为键 Window。由于 UIWindow 是从 UIView class 继承的,因此可以按照您想要的方式对其进行动画处理,并且您的动画 DatePicker 是从头开始构建的。
P.S 您也可以将其发布为 CocoaPod。 ;)
iOS14介绍了UIDatePicker实例属性datePickerStyle{get}和preferredDatePickerStyle{set get}。您的“损坏的” UIDatePicker 似乎是新样式之一。如果您期待“轮子”外观,请尝试将 perferredDatePickerStyle 属性 设置为 UIDatePickerStyle.wheels。这可能会导致您的错误,因为日期选择器紧凑视图将与 UTDatePickerStyle.compact 样式相关联。