【问题标题】:iOS 13 UISplitView ProblemsiOS 13 UISplitView 问题
【发布时间】: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 开始(或者,至少在那之前没有见过)。每隔一段时间就会发生一次——也许一天一次。

标签: swift iphone uisplitviewcontroller detailview ios13


【解决方案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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-01-20
            • 1970-01-01
            • 2020-01-23
            • 2020-05-01
            • 1970-01-01
            • 1970-01-01
            • 2020-05-12
            • 2020-03-14
            相关资源
            最近更新 更多