cop*_*ing 8 uiviewcontroller uikit ios swift ios13
我正在为 iOS 13 的新“卡片式”模式视图更新我的应用程序。使用UIAdaptivePresentationControllerDelegate'spresentationControllerDidAttemptToDismiss()和presentationControllerDidDismiss()函数,一切都运行良好。但是,对于他们的意见.modalPresentationStyle设置为.popover,presentationControllerDidDismiss()在紧凑的环境中(如分离式或滑盖通过电话或iPad)被提出时,不叫。在常规尺寸类环境(例如 iPad 全屏)中呈现时,它会被正确调用。
我的代码设置非常简单:
呈现弹出框的代码:
func showChooser() {
// other setup code...
navController.modalPresentationStyle = .popover
navController.popoverPresentationController?.barButtonItem = self.viewController?.navigationItem.leftBarButtonItem
self.present(navController, animated: true)
}
Run Code Online (Sandbox Code Playgroud)
然后,呈现的控制器符合UIAdaptivePresentationControllerDelegate并设置:
// This is in the presented view controller (i.e. the popover)
override func viewDidLoad() {
// other setup removed for brevity…
self.navigationController?.presentationController?.delegate = self
}
func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
print("did dismiss")
self.cancel?()
}
Run Code Online (Sandbox Code Playgroud)
当视图在常规大小类环境中呈现时,它会正确显示为弹出框。当用户在弹出框外点击时, thenpresentationControllerDidDismiss()被调用。但是,当相同的代码出现在紧凑的环境中时,它会正确显示(作为卡片样式),但是当用户向下拖动视图时,presentationControllerDidDismiss()不会被调用。
如果我将 更改.modalPresentationStyle为其他内容,例如.pageSheet或.formSheet,那么它在紧凑或常规演示文稿中都按预期工作。
我已经尝试使用委托adaptivePresentationStyle()将样式更改为.formSheet紧凑环境,但presentationControllerDidDismiss()仍然没有正确调用。
更新:我应该提到我当前的解决方法是检查大小类并.modalPresentationStyle根据需要进行更改:
if self.traitCollection.horizontalSizeClass == .compact {
navController.modalPresentationStyle = .automatic
} else {
navController.modalPresentationStyle = .popover
navController.popoverPresentationController?.barButtonItem = self.viewController?.navigationItem.leftBarButtonItem
}
Run Code Online (Sandbox Code Playgroud)
这有效,但似乎仅使用.popover样式应该正确适应并调用正确的委托方法。
更新 2: 我已经更新了上面的代码,以阐明所呈现的视图控制器是处理委托方法的控制器。
此外,在深入研究之后,我注意到如果呈现视图控制器是委托并处理委托方法,那么这一切都按预期工作。由于它也是在工作呈现视图控制器对所有.modalPresentationStyle的,除了在紧凑的环境酥料饼,也许是当popovers以这种方式呈现一些生命周期的问题?
关于我可能做错了什么的任何想法?
mat*_*att 17
问题只是时机之一。您正在第二个视图控制器中执行此操作:
override func viewDidLoad() {
self.navigationController?.presentationController?.delegate = self
}
Run Code Online (Sandbox Code Playgroud)
这太晚。您可以在配置和执行演示的位置设置代理:
func showChooser() {
navController.modalPresentationStyle = .popover
navController.popoverPresentationController?.barButtonItem =
self.viewController?.navigationItem.leftBarButtonItem
navController.presentationController?.delegate = // *
navController.viewControllers[0]
as! UIAdaptivePresentationControllerDelegate
self.present(navController, animated: true)
}
Run Code Online (Sandbox Code Playgroud)
如果您更愿意坚持让第二个视图控制器将自己设置为委托,请尽早执行。第一个好机会是willMove:
override func willMove(toParent parent: UIViewController?) {
self.parent?.presentationController?.delegate = self
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5880 次 |
| 最近记录: |