iPad旋转设备时仅关闭显示中的MenuViewController方案咨询
解决iPad Popover旋转时误关闭父ViewController的问题
方案一:保存当前弹出的导航控制器引用(推荐)
通过跟踪当前正在呈现的导航控制器实例,精准控制仅在菜单存在时执行关闭操作,避免误触父控制器。
- 调整变量定义与弹出逻辑,新增导航控制器引用并监听关闭事件:
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 }
- 实现代理方法,在菜单关闭时清空导航控制器引用:
extension YourViewController: UIAdaptivePresentationControllerDelegate { func presentationControllerDidDismiss(_ presentationController: UIPresentationController) { currentMenuNavController = nil } }
- 修改旋转逻辑,仅在导航控制器存在且处于呈现状态时执行关闭:
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
相关产品推荐
相关产品推荐

