首页 > 解决方案 > 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 模式?

我找不到任何官方代码示例或文档。我感谢在这方面的任何帮助。

标签: iosswiftuisplitviewcontrollerios14

解决方案


我使用 UISplitViewControllerDelegate 的委托方法 splitViewControllerDidExpand(_ svc: UISplitViewController)。在这种方法中,您可以获得标签栏的 selectedIndex(在紧凑模式下处于活动状态的 VC),它允许您确定在常规模式下显示哪个 VC。最后,使用 showDetailViewController(_vc: UIViewController, sender: Any?) 显示相应的VC

可能还有其他方法,但上述方法对我来说很好。


推荐阅读