You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iPad旋转设备时仅关闭显示中的MenuViewController方案咨询

解决iPad Popover旋转时误关闭父ViewController的问题

方案一:保存当前弹出的导航控制器引用(推荐)

通过跟踪当前正在呈现的导航控制器实例,精准控制仅在菜单存在时执行关闭操作,避免误触父控制器。

  1. 调整变量定义与弹出逻辑,新增导航控制器引用并监听关闭事件:
private var currentMenuNavController: UINavigationController?
private lazy var menuPadViewController = MenuViewController()

private func presentMenuVC(from sourceView: UIButton) {
    let nc = UINavigationController(rootViewController: menuPadViewController)
    nc.modalPresentationStyle = .popover
    nc.popoverPresentationController?.sourceView = sourceView
    // 设置代理监听菜单关闭,及时清空引用
    nc.presentationController?.delegate = self
    present(nc, animated: true)
    currentMenuNavController = nc
}
  1. 实现代理方法,在菜单关闭时清空导航控制器引用:
extension YourViewController: UIAdaptivePresentationControllerDelegate {
    func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
        currentMenuNavController = nil
    }
}
  1. 修改旋转逻辑,仅在导航控制器存在且处于呈现状态时执行关闭:
public override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    guard let menuNav = currentMenuNavController, menuNav.presentingViewController != nil else {
        return
    }
    menuNav.dismiss(animated: true)
    currentMenuNavController = nil
}

方案二:直接判断菜单的呈现状态

无需引入代理,通过检查菜单控制器或其导航控制器的presentingViewController是否存在,判断是否需要关闭:

public override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    // 验证菜单是否处于被呈现状态
    let isMenuPresented = menuPadViewController.presentingViewController != nil || 
                          (menuPadViewController.navigationController?.presentingViewController != nil)
    if isMenuPresented {
        menuPadViewController.dismiss(animated: true)
    }
}

方案三:利用Popover专属可见性判断

针对popover场景,直接通过popoverPresentationController的isPopoverVisible属性判断:

public override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    guard let popoverPC = menuPadViewController.navigationController?.popoverPresentationController, 
          popoverPC.isPopoverVisible else {
        return
    }
    menuPadViewController.dismiss(animated: true)
}

内容的提问来源于stack exchange,提问作者martin wotterman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:41:12