【问题标题】:Swift UISplitViewController - unable to present master view before detail view (iOS 14, Xcode 12.4)Swift UISplitViewController - 无法在详细视图之前呈现主视图(iOS 14,Xcode 12.4)
【发布时间】:2021-05-06 19:21:27
【问题描述】:

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

我已经尝试了所有我能想到的方法。例如,我为拆分视图控制器创建了一个类MainSplitVC,其中我将UISplitViewControllerUISplitViewControllerDelegate 子类化。然后,在viewDidLoad() 中,我将首选显示模式设置为oneBesideSecondary(因为根据Xcode 将allVisible 替换为那个)。我还包含了函数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 应该可以完成这项工作。但是,这些都不起作用。更重要的是,collapseSecondary() 函数甚至没有被调用,即使我在类头中包含了UISplitViewControllerDelegate

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

我参考的链接如下:

谢谢!

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

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

collapseSecondary 函数显然不起作用,因为存在“Interface Builder 不允许创建经典样式 UISplitViewController。(65966010) (FB8107534)”的错误,因此我收到错误消息“跳过委托回调, splitViewController:collapseSecondaryViewController:ontoPrimaryViewController:。不支持 UISplitViewController 样式 DoubleColumn"。

谢谢!

【问题讨论】:

    标签: ios swift xcode uisplitviewcontroller


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这对我不起作用。我认为它会起作用,但该函数甚至从未被调用过。我在函数内部添加了一个打印语句进行测试,并且从未调用过该打印语句。我觉得这可能是一个委托问题,但我已经设置了拆分视图控制器的委托,所以我不确定除了 viewDidLoad 之外没有调用 UISplitViewControllerDelegate 的这些函数。 .
    • 你只需要设置委托(UISplitViewControllerDelegate)。发布您的完整代码(此处或在 github 中),以便我可以重现该问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 2012-05-19
    • 2016-07-07
    相关资源
    最近更新 更多