自定义UIViewController转场动画展示生效,Dismissal时失效求助
解决UISplitViewController左侧导航模态展示相关问题
Hey,针对你描述的场景——UISplitViewController左侧挂载UINavigationController A,通过Storyboard Segue(配置为Kind = Present Modally、Presentation = Over Current Context、Transition = Default、Animates = true)模态展示UINavigationController B,且A的根控制器有let the...相关属性——我整理了几个高频问题的解决方案:
1. 优雅关闭模态的UINavigationController B
不管是从B内部还是从A触发关闭,都有对应的实现方式:
- 从B的子控制器关闭:直接调用导航控制器的dismiss方法即可
self.navigationController?.dismiss(animated: true, completion: nil) - 从A的根控制器关闭:如果你的
let the...属性是用来持有B的引用(比如let presentedBNav: UINavigationController?),直接通过这个引用调用dismiss:presentedBNav?.dismiss(animated: true) { // 关闭后的回调逻辑,比如恢复A的交互状态 }
2. 解决Over Current Context导致的背景交互问题
因为你设置了Presentation = Over Current Context,模态窗口展示后,背后的SplitViewController左侧栏(A的区域)可能还会响应触摸,如果你想禁用背景交互:
- 在触发Segue展示B之前,禁用A根控制器的视图交互:
self.view.isUserInteractionEnabled = false - 在关闭B的completion回调中恢复交互:
self.navigationController?.dismiss(animated: true) { self.view.isUserInteractionEnabled = true }
3. 从A向B传递数据
利用Segue的prepare(for:sender:)方法,结合你提到的let the...属性完成数据传递:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard segue.identifier == "YourSegueID", // 替换成你Segue的实际ID let bNav = segue.destination as? UINavigationController, let bRootVC = bNav.topViewController as? BRootViewController // 替换成B的根控制器类型 else { return } // 用你定义的the属性给B传递数据 bRootVC.targetProperty = self.theProperty }
4. iPad上的布局适配优化
在iPad上,SplitViewController的左侧栏布局可能会和模态窗口冲突,你可以在B的根控制器里做一点适配:
override func viewDidLoad() { super.viewDidLoad() // 确保模态展示样式保持一致 self.navigationController?.modalPresentationStyle = .overCurrentContext // 对齐A的导航栏样式,提升视觉一致性 if let presentingNavStyle = presentingViewController?.navigationController?.navigationBar.barStyle { navigationController?.navigationBar.barStyle = presentingNavStyle } }
内容的提问来源于stack exchange,提问作者stackunderflow
相关产品推荐
相关产品推荐

