ios - iOS UISplitViewController - 从紧凑布局更改为常规布局时如何恢复导航状态
问题描述
我正在实现 iOS 14 中引入的新 UISplitViewController API。当应用程序处于常规模式时,我有一个 .doubleColumn 布局,其主视图是用于导航的 UICollectionView,而相应的 UIViewControllers 用于辅助视图。对于 .compact 布局,我使用的是 UITabBarController。
现在我想在布局从常规变为紧凑时实现导航状态恢复,反之亦然。我已经观看了相应的 WWDC 2020 视频https://developer.apple.com/videos/play/wwdc2020/10105/,他们在其中讨论了状态恢复实施的样子。缺少的是用于检测布局更改的实际方法。
我已经发现,我可以使用该splitViewController(_ svc: UISplitViewController, topColumnForCollapsingToProposedTopColumn proposedTopColumn: UISplitViewController.Column)
方法来检测 SplitVC 何时更改为.compact
模式。
以及splitViewController(_ svc: UISplitViewController, displayModeForExpandingToProposedDisplayMode proposedDisplayMode: UISplitViewController.DisplayMode)
SplitVC 从 .compact 变为 .regular 时的方法。
现在回答我的问题。当我想更改 SplitVC 的辅助视图控制器时,在后一种委托方法中,为了选择与 TabBar 中当前可见的视图控制器匹配的正确视图控制器(.compact 模式),我的应用程序因以下错误而崩溃信息。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Mutating UISplitViewController with -setViewController:forColumn: is not allowed during a delegate callback.'
当我无法setViewController(_ vc: UIViewController?, for column: UISplitViewController.Column)
在委托方法中使用时,我应该如何准备 SplitVC 时变回 .regular 模式?
我找不到任何官方代码示例或文档。我感谢在这方面的任何帮助。
解决方案
我使用 UISplitViewControllerDelegate 的委托方法 splitViewControllerDidExpand(_ svc: UISplitViewController)。在这种方法中,您可以获得标签栏的 selectedIndex(在紧凑模式下处于活动状态的 VC),它允许您确定在常规模式下显示哪个 VC。最后,使用 showDetailViewController(_vc: UIViewController, sender: Any?) 显示相应的VC
可能还有其他方法,但上述方法对我来说很好。
推荐阅读
- python - 如何在 tkinter Python 3.7 中为组合框下拉菜单绑定按键事件
- vim - VI 显示使用 git bash split 拆分大文本文件后的控制字符
- javascript - 如何限制 100 个 Chartjs 中的样本
- spring - Spring在创建父对象时如何添加子实体
- sql - 运行排除重复行的 JOIN 语句
- css - 如何设置我在 chrome FreeBSD 23 上运行的 reactjs 应用程序的样式?
- mysql - 如果表中已存在字符串,如何设置触发器?
- python-3.x - 如何在绘制后修改散点图的颜色图
- jquery-ui - jQuery Ui 小部件菜单在悬停父项上显示所有子项
- javascript - Resize text to fit div