在iPadOS 17上,当关闭一个弹出框然后快速再次呈现时会发生崩溃。通常错误如下:UIPopoverPresentationController should have a non-nil sourceView or barButtonItem set before the presentation occurs
但我偶尔会看到以下情况:Application tried to present modally a view controller that is already being presented by the [main view controller]
这是重现此崩溃所需的最小源代码:
class ViewController: UIViewController {
let popoverVC = UIViewController()
@IBOutlet var showPopoverButton: UIButton!
@IBAction func showPopoverTapped(_ sender: UIButton) {
popoverVC.modalPresentationStyle = .popover
popoverVC.popoverPresentationController?.sourceView = showPopoverButton
present(popoverVC, animated: true)
}
}
关于这个问题需要考虑的其他一些事情:
1.这在iOS 16或更早版本中不会发生。
1.在popoverPresentationController
上设置.sourceRect
没有效果。
1.设置弹出框的frame
或preferredContentSize
无效。
1.崩溃发生在UIKit中,无论是否有故事板(硬编码的UI)。
- SwiftUI中不会发生崩溃。请不要建议SwiftUI作为修复。
1.我可以在演示之前添加一个guard
,以确保sourceView
不是nil
,但它没有效果。
出现此问题的原因似乎是,当显示新的弹出框时,弹出框视图控制器没有从内存中完全释放。这是在制造某种碰撞我已经成功地混合了UIPopoverPresentationController.dismissalTransitionWillBegin
,我很乐意发布这个解决方案,但首先我想看看是否有更少的破解方法。我不想简单地覆盖dismissalTransitionWillBegin
,因为我想要默认的行为,也不想重写我自己的弹出动画来满足这个bug。
1条答案
按热度按时间093gszye1#
我在iPadOS 17上也遇到了同样的崩溃。它并不总是发生,所以它是棘手的,为什么会发生。
我目前的解决方法是在继续并呈现一个新的视图控制器之前,检查当前的视图控制器是否呈现另一个视图控制器。到目前为止,这似乎对我有用。