Swift UISplitViewController - 无法在详细视图之前呈现主视图(iOS 14,Xcode 12.4)

Swift UISplitViewController - unable to present master view before detail view (iOS 14, Xcode 12.4)

我在使用 UISplitViewController MainSplitVC 时遇到这个问题,我无法在细节视图控制器上显示主视图控制器。基本上,在 iPad 上测试时,我希望主图和细节 VC 并排可见,但在 iPhone(纵向模式)上,我只想要主图 VC。目前,这适用于 iPad,但在纵向模式的 iPhone 上,Swift 首先显示详细视图控制器,我必须单击导航栏中的后退按钮才能 return 到主视图控制器。

我已经尝试了所有我能想到的可能的方法。例如,我为 Split View Controller 创建了一个 class,MainSplitVC,其中我子 class UISplitViewControllerUISplitViewControllerDelegate。然后,在 viewDidLoad() 中,我将首选显示模式设置为 oneBesideSecondary(因为 allVisible 已被 Xcode 所取代)。我还包括函数 collapseSecondary() 以始终折叠回主视图控制器。

class MainSplitVC: UISplitViewController, UISplitViewControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
        print("viewDidLoad called")
        self.preferredDisplayMode = UISplitViewController.DisplayMode.oneBesideSecondary
    }

    func splitViewController(
             _ splitViewController: UISplitViewController,
             collapseSecondary secondaryViewController: UIViewController,
             onto primaryViewController: UIViewController) -> Bool {
        print("collapseSecondary called")
        return true
    }
    
}

关于这个问题我参考了很多其他帖子,所有帖子都指出使用collapseSecondary()函数并将preferredDisplayMode设置为oneBesideSecondaryallVisible应该可以工作。但是,其中 none 有效。更重要的是 collapseSecondary() 函数甚至没有被调用,即使我在 class header.

中包含了 UISplitViewControllerDelegate

谁能澄清我在下面的代码中是否有任何错误?当应用程序打开时,我只想显示主视图控制器;详细视图控制器只是一个空白视图控制器,当单击主视图控制器的表视图中的某些内容时,它会更改为另一个视图控制器。

我参考的链接如下:

谢谢!

编辑 2/3/21:我已经解决了这个问题。我改为在 UISplitViewControllerDelegate 下扩展 SceneDelegate 并包含以下功能:

func splitViewController(_ svc: UISplitViewController, topColumnForCollapsingToProposedTopColumn proposedTopColumn: UISplitViewController.Column) -> UISplitViewController.Column {
    return .primary
}

collapseSecondary 函数显然没有工作,因为存在“Interface Builder 不允许创建 classic 风格的 UISplitViewController。(65966010) (FB8107534)”的错误,所以我收到错误消息“跳过委托回调,splitViewController:collapseSecondaryViewController:ontoPrimaryViewController:。不支持 UISplitViewController 样式 DoubleColumn”。

谢谢!

返回 .primary 应该可以解决您的问题。

@available(iOS 14.0, *)
public func splitViewController(_ svc: UISplitViewController, topColumnForCollapsingToProposedTopColumn proposedTopColumn: UISplitViewController.Column) -> UISplitViewController.Column {
    return .primary
}

[来自文档] 要求代理提供拆分视图界面折叠后显示的列。

当拆分视图控制器从水平常规尺寸转换为水平紧凑尺寸时 class,它会调用此方法并要求您在转换完成时显示要显示的列。使用此方法自定义要折叠到的视图控制器。