iOS 17 UIKit Popover Crash on iPad - UIPopoverPresentationController should have a non-nil sourceView

pcww981p  于 2023-10-21  发布在  iOS
关注(0)|答案(1)|浏览(151)

在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.设置弹出框的framepreferredContentSize无效。
1.崩溃发生在UIKit中,无论是否有故事板(硬编码的UI)。

  1. SwiftUI中不会发生崩溃。请不要建议SwiftUI作为修复。
    1.我可以在演示之前添加一个guard,以确保sourceView不是nil,但它没有效果。
    出现此问题的原因似乎是,当显示新的弹出框时,弹出框视图控制器没有从内存中完全释放。这是在制造某种碰撞我已经成功地混合了UIPopoverPresentationController.dismissalTransitionWillBegin,我很乐意发布这个解决方案,但首先我想看看是否有更少的破解方法。我不想简单地覆盖dismissalTransitionWillBegin,因为我想要默认的行为,也不想重写我自己的弹出动画来满足这个bug。

093gszye

093gszye1#

我在iPadOS 17上也遇到了同样的崩溃。它并不总是发生,所以它是棘手的,为什么会发生。
我目前的解决方法是在继续并呈现一个新的视图控制器之前,检查当前的视图控制器是否呈现另一个视图控制器。到目前为止,这似乎对我有用。

guard self.presentedViewController == nil else { return }

相关问题