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
.
在 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
.