iOS 13 个 UISplitView 问题

iOS 13 UISplitView Problems

在 iOS 13 Beta 5 上,我目前在 iPhone 上使用 UISplitView 时遇到问题。

我的应用从我的 splitview 的 detailsview 开始,而不是我的 masterview(看图片)

有谁知道我如何在 iOS 13 下解决这个问题?在 iOS 12 一切都很好 ☹️

提前致谢塞巴斯蒂安


编辑:

很抱歉回答晚了,我正在短途旅行中没有任何互联网:/

我的 Class 看起来像这样:


class MyClass : UITableViewController, UISplitViewControllerDelegate, UIPickerViewDelegate {

override func viewDidLoad() {
        super.viewDidLoad()

        if (UIDevice.current.userInterfaceIdiom == .pad){
            navigationController?.navigationBar.isTranslucent = false
        }

        /*SplitView*/

        splitViewController?.preferredDisplayMode = .allVisible
        splitViewController?.delegate = self

        self.definesPresentationContext = true

}

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

}


我认为这看起来像是解决此问题的正常程序:/

你试过这个吗(UISplitViewControllerDelegate):

self.preferredDisplayMode = .allVisible

&

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

我遇到了同样的问题。

经过一些调查,似乎 viewDidLoad 来不及将其设置为全部可见。

我将 UISplitViewController 子类化并更改了 awakeFromNib 方法中的设置。现在它按预期工作。

Alxlives 的回答对我有帮助。通过使用调试器,我注意到在主视图控制器中,未调用 viewDidLoad。所以永远不会设置委托,因此永远不会调用折叠方法。

我通过在 awakeFromNib() 中设置委托来解决这个问题:

override func awakeFromNib() {
    self.splitViewController?.delegate = self
}

现在splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool被调用了,如果你return为true,就会显示master。

Splitviewcontroller ViewDidLoad() 方法中尝试 MasterViewController_Instance.view.layoutIfNeeded()。它解决了我的问题。

class CustomSplitController: UISplitViewController{ 
    override public func viewDidLoad() {

        MASTER_CONTROLLER_INSTANCE.view.layoutIfNeeded()
        //If you are using navigation controller in master controller try 
        MASTER_CONTROLLER_INSTANCE.navigationController?.view.layoutIfNeeded()
    }
}

Warren Milward 的回答帮助我指引了正确的方向,但实际上我在 viewDidLoad() 中得到了它。

我最终使用了 UISplitViewController 的子类,并在 viewDidLoad() 中设置了所需的值,并在此处设置了委托调用。

class CustomSplitViewController: UISplitViewController, UISplitViewControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.delegate = self
        self.preferredDisplayMode = .allVisible
    }

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

这里的许多答案导致拆分视图控制器启动顺序发生变化,我意识到,在紧凑尺寸下,它仅在细节控制器上执行 vewDidLoad。但是 awakeFromNib 在 每个 控制器上被调用。所以 - 我刚刚将我的代码从 viewDidLoad 转移到 awakeFromNib,现在一切正常!

override func awakeFromNib() {
    super.awakeFromNib()

    if let splitController = splitViewController {
        splitController.delegate = self
    }
}

我在 appdelegate 上设置了 spliteViewController 的委托,它起作用了

对于那些使用故事板并在 UIStoryboardSegue 的子类中配置新控制器的人来说,它会更简单:

就在之前 [source presentViewController:destination animated:YES completion:nil];, 只需设置 destination.modalPresentationStyle = UIModalPresentationFullScreen;,因为现在默认为 UIModalPresentationPageSheet.