Enable switching between navigation modes
This commit is contained in:
parent
f1a6a405c2
commit
75caf2c1eb
|
@ -7,6 +7,7 @@
|
|||
//
|
||||
|
||||
import UIKit
|
||||
import Combine
|
||||
|
||||
class MainSplitViewController: UISplitViewController {
|
||||
|
||||
|
@ -20,10 +21,13 @@ class MainSplitViewController: UISplitViewController {
|
|||
|
||||
private var tabBarViewController: MainTabBarViewController!
|
||||
|
||||
private var navigationMode: Preferences.WidescreenNavigationMode!
|
||||
private var secondaryNavController: NavigationControllerProtocol! {
|
||||
viewController(for: .secondary) as? NavigationControllerProtocol
|
||||
}
|
||||
|
||||
private var cancellables = Set<AnyCancellable>()
|
||||
|
||||
private var sidebarVisibile: Bool {
|
||||
get {
|
||||
(UserDefaults.standard.object(forKey: "MainSplitViewControllerSidebarVisible") as? Bool) ?? true
|
||||
|
@ -60,11 +64,18 @@ class MainSplitViewController: UISplitViewController {
|
|||
hide(.primary)
|
||||
}
|
||||
|
||||
let multiColumnNav = MultiColumnNavigationController()
|
||||
setViewController(multiColumnNav, for: .secondary)
|
||||
|
||||
// let splitNav = SplitNavigationController()
|
||||
// setViewController(splitNav, for: .secondary)
|
||||
let nav: UIViewController
|
||||
navigationMode = Preferences.shared.widescreenNavigationMode
|
||||
switch navigationMode! {
|
||||
case .stack:
|
||||
nav = EnhancedNavigationViewController()
|
||||
case .splitScreen:
|
||||
nav = SplitNavigationController()
|
||||
case .multiColumn:
|
||||
nav = MultiColumnNavigationController()
|
||||
}
|
||||
setViewController(nav, for: .secondary)
|
||||
|
||||
// don't unnecesarily construct a content VC unless the we're in actually split mode
|
||||
// when we change from compact -> split for the first time, the VC will be transferred anyways
|
||||
if traitCollection.horizontalSizeClass != .compact {
|
||||
|
@ -94,6 +105,37 @@ class MainSplitViewController: UISplitViewController {
|
|||
addKeyCommand(MenuController.composeCommand)
|
||||
|
||||
MenuController.sidebarItemKeyCommands.forEach(addKeyCommand(_:))
|
||||
|
||||
Preferences.shared.$widescreenNavigationMode
|
||||
.sink { [unowned self] in
|
||||
self.updateNavigationMode($0)
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
}
|
||||
|
||||
private func updateNavigationMode(_ mode: Preferences.WidescreenNavigationMode) {
|
||||
guard mode != navigationMode else {
|
||||
return
|
||||
}
|
||||
let viewControllers = secondaryNavController.viewControllers
|
||||
secondaryNavController.viewControllers = []
|
||||
// Setting viewControllers = [] doesn't remove the VC views from their superviews immediately,
|
||||
// so do that ourselves so we can re-parent the VCs to the new nav controller.
|
||||
for viewController in viewControllers {
|
||||
viewController.viewIfLoaded?.removeFromSuperview()
|
||||
}
|
||||
|
||||
let newNav: NavigationControllerProtocol
|
||||
switch mode {
|
||||
case .stack:
|
||||
newNav = EnhancedNavigationViewController()
|
||||
case .splitScreen:
|
||||
newNav = SplitNavigationController()
|
||||
case .multiColumn:
|
||||
newNav = MultiColumnNavigationController()
|
||||
}
|
||||
newNav.viewControllers = viewControllers
|
||||
self.setViewController(newNav, for: .secondary)
|
||||
}
|
||||
|
||||
func select(item: MainSidebarViewController.Item) {
|
||||
|
|
|
@ -290,6 +290,9 @@ private class SplitSecondaryNavigationController: EnhancedNavigationViewControll
|
|||
|
||||
override var viewControllers: [UIViewController] {
|
||||
didSet {
|
||||
for vc in oldValue where vc.parent !== self {
|
||||
removeSecondarySplitCloseButton(for: vc)
|
||||
}
|
||||
if let first = viewControllers.first {
|
||||
configureSecondarySplitCloseButton(for: first)
|
||||
}
|
||||
|
@ -324,6 +327,12 @@ private class SplitSecondaryNavigationController: EnhancedNavigationViewControll
|
|||
viewController.navigationItem.leftBarButtonItem = item
|
||||
}
|
||||
|
||||
private func removeSecondarySplitCloseButton(for viewController: UIViewController) {
|
||||
if viewController.navigationItem.leftBarButtonItem?.tag == ViewTags.splitNavCloseSecondaryButton {
|
||||
viewController.navigationItem.leftBarButtonItem = nil
|
||||
}
|
||||
}
|
||||
|
||||
@objc private func closeSecondary() {
|
||||
closeSecondaryImpl()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue