105 lines
5.8 KiB
Swift
105 lines
5.8 KiB
Swift
//
|
|
// NavigationController.swift
|
|
// MVMCoreUI
|
|
//
|
|
// Created by Scott Pfeil on 10/24/19.
|
|
// Copyright © 2019 Verizon Wireless. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
@objcMembers open class NavigationController: UINavigationController {
|
|
public var separatorView: Line?
|
|
|
|
/// Getter for the main navigation controller
|
|
public static func navigationController() -> Self? {
|
|
return MVMCoreActionUtility.initializerClassCheck(MVMCoreUISession.sharedGlobal()?.navigationController, classToVerify: self) as? Self
|
|
}
|
|
|
|
/// Provides MVM styling to the navigation bar. Returns a reference to the line.
|
|
public static func style(_ navigationBar: UINavigationBar) -> Line {
|
|
navigationBar.backgroundColor = .white
|
|
navigationBar.shadowImage = UIImage()
|
|
navigationBar.isOpaque = true
|
|
navigationBar.tintColor = .black
|
|
navigationBar.titleTextAttributes = [NSAttributedString.Key.font: MFStyler.fontBoldBodySmall(false)];
|
|
return Line(pinTo: navigationBar, edge: .bottom, useMargin: false)
|
|
}
|
|
|
|
/// Sets up the application with a navigation controller
|
|
public static func setupNavigationController() -> Self? {
|
|
let navigationController = self.init()
|
|
navigationController.separatorView = style(navigationController.navigationBar)
|
|
MVMCoreUISession.sharedGlobal()?.navigationController = navigationController
|
|
MVMCoreNavigationHandler.shared()?.viewControllerToPresentOn = navigationController
|
|
MVMCoreNavigationHandler.shared()?.navigationController = navigationController
|
|
return navigationController
|
|
}
|
|
|
|
/// Sets up the application with a navigation controller as the main container.
|
|
public static func setupNavigationControllerAsMainController() -> Self? {
|
|
guard let navigationController = setupNavigationController() else { return nil }
|
|
MVMCoreUISession.sharedGlobal()?.setup(asStandardLoadViewDelegate: navigationController)
|
|
return navigationController
|
|
}
|
|
|
|
/// Convenience function for setting the navigation buttons.
|
|
public static func setNavigationButtons(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol, viewController: UIViewController) {
|
|
let delegate = (viewController as? MVMCoreViewControllerProtocol)?.delegateObject?() as? MVMCoreUIDelegateObject
|
|
var leftItems: [UIBarButtonItem] = []
|
|
if let backButtonModel = navigationItemModel.backButton,
|
|
navigationController.viewControllers.count > 1 || navigationItemModel.alwaysShowBackButton {
|
|
leftItems.append(backButtonModel.createNavigationItemButton(delegateObject: delegate, additionalData: nil))
|
|
}
|
|
if let leftItemModels = navigationItemModel.additionalLeftButtons {
|
|
for item in leftItemModels {
|
|
leftItems.append(item.createNavigationItemButton(delegateObject: delegate, additionalData: nil))
|
|
}
|
|
}
|
|
viewController.navigationItem.leftBarButtonItems = leftItems.count > 0 ? leftItems : nil
|
|
|
|
var rightItems: [UIBarButtonItem] = []
|
|
if let rightItemModels = navigationItemModel.additionalRightButtons {
|
|
for item in rightItemModels {
|
|
rightItems.append(item.createNavigationItemButton(delegateObject: delegate, additionalData: nil))
|
|
}
|
|
}
|
|
viewController.navigationItem.rightBarButtonItems = rightItems.count > 0 ? rightItems : nil
|
|
}
|
|
|
|
/// Convenience function for setting the navigation bar ui, except for the buttons.
|
|
public static func setNavigationUI(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol, viewController: UIViewController) {
|
|
viewController.navigationItem.title = navigationItemModel.title
|
|
viewController.navigationItem.accessibilityLabel = navigationItemModel.title
|
|
viewController.navigationItem.hidesBackButton = (navigationItemModel.backButton != nil)
|
|
|
|
navigationController.setNavigationBarHidden(navigationItemModel.hidden, animated: true)
|
|
navigationController.navigationBar.barTintColor = navigationItemModel.backgroundColor?.uiColor ?? .white
|
|
|
|
let tint = navigationItemModel.tintColor.uiColor
|
|
navigationController.navigationBar.tintColor = tint
|
|
|
|
// Have the navigation title match the tint color
|
|
navigationController.navigationBar.titleTextAttributes?.updateValue(tint, forKey: .foregroundColor)
|
|
|
|
// Update line.
|
|
if let navigationController = navigationController as? NavigationController {
|
|
navigationController.separatorView?.isHidden = navigationItemModel.line?.type ?? .standard == .none
|
|
}
|
|
}
|
|
|
|
/// Convenience function for setting navigation bar with model.
|
|
public static func set(navigationController: UINavigationController, navigationItemModel: NavigationItemModelProtocol, viewController: UIViewController) {
|
|
setNavigationUI(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
|
|
setNavigationButtons(navigationController: navigationController, navigationItemModel: navigationItemModel, viewController: viewController)
|
|
}
|
|
|
|
/// Convenience setter for legacy files
|
|
public static func set(navigationController: UINavigationController, navigationJSON: [String: Any], viewController: UIViewController) throws {
|
|
guard let barModel = try MoleculeObjectMapping.shared()?.getMoleculeModelForJSON(navigationJSON) as? (MoleculeModelProtocol & NavigationItemModelProtocol) else {
|
|
throw ModelRegistry.Error.decoderOther(message: "Model not a bar model")
|
|
}
|
|
set(navigationController: navigationController, navigationItemModel: barModel, viewController: viewController)
|
|
}
|
|
}
|