iOS 13 UISplitView 问题

Posted

技术标签:

【中文标题】iOS 13 UISplitView 问题【英文标题】:iOS 13 UISplitView Problems 【发布时间】:2019-12-12 10:42:07 【问题描述】:

ios 13 Beta 5 上,我目前在 iPhone 上的 UISplitView 存在问题。

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

有谁知道我如何在 iOS 13 下解决这个问题?在 iOS 12 上,一切都像魅力一样运行☹️

提前谢谢塞巴斯蒂安


编辑:

对不起,我在没有任何互联网的情况下进行了一次短暂的假期旅行:/

我的班级看起来像这样:


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
    




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

【问题讨论】:

你还没有告诉我们你在 iOS 12 上做了什么。(你真的没有告诉我们任何事情。) UISplitViewController 的委托必须配置为显示主视图而不是详细视图。向我们展示你是如何做到的。 我编辑我的问题 我的拆分视图也有同样的问题。总是从 iPhone 上的细节视图开始(在我的例子中是 X)。尽管在 viewDidLoad 中将委托设置为我的视图控制器,但我的 UISplitViewController 委托方法也没有被调用。你解决过这个问题吗? 不,我暂时没有解决问题:/ 这里也一样。也从 Beta 5 开始(或者,至少在那之前没有见过)。每隔一段时间就会发生一次——也许一天一次。 【参考方案1】:

你试过这个吗(UISplitViewControllerDelegate):

self.preferredDisplayMode = .allVisible

&

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

【讨论】:

别忘了 self.delegate = self【参考方案2】:

我有同样的问题。

经过一番调查,viewDidLoad 似乎为时已晚,无法将其设置为全部可见。

我继承了UISplitViewController 并更改了awakeFromNib 方法中的设置。现在它按预期工作了。

【讨论】:

谢谢它对我有很大帮助。现在我的应用程序在我的 iPhone 上的 masterview 中成功启动【参考方案3】:

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

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

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

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

【讨论】:

viewDidLoad 未被调用是一种误导。 viewDidLoad总是在适当的时间被调用。如果你有一些错误配置,它在别处。【参考方案4】:

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()
    

【讨论】:

【参考方案5】:

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
    

【讨论】:

【参考方案6】:

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

override func awakeFromNib() 
    super.awakeFromNib()

    if let splitController = splitViewController 
        splitController.delegate = self
    

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

以上是关于iOS 13 UISplitView 问题的主要内容,如果未能解决你的问题,请参考以下文章

更改 UISplitView 中的 RootViewController

UISplitView,在设置代表时接收语义问题

UISplitView - 为 masterView 中的每一行加载不同的 detailView

UISplitView 方向问题

如何对 UISplitView 进行动画切换?

UISplitview:从 appDelegate 访问 UITabBarController