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