DismissibleHostingController.swift 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. //
  2. // DismissibleHostingController.swift
  3. // LoopKitUI
  4. //
  5. // Created by Michael Pangburn on 5/7/20.
  6. // Copyright © 2020 LoopKit Authors. All rights reserved.
  7. //
  8. import SwiftUI
  9. public class DismissibleHostingController: UIHostingController<AnyView> {
  10. public enum DismissalMode {
  11. case modalDismiss
  12. case pop(to: UIViewController.Type)
  13. }
  14. private var onDisappear: () -> Void = {}
  15. public convenience init<Content: View>(
  16. rootView: Content,
  17. dismissalMode: DismissalMode = .modalDismiss,
  18. isModalInPresentation: Bool = true,
  19. onDisappear: @escaping () -> Void = {},
  20. carbTintColor: Color = .green,
  21. glucoseTintColor: Color = Color(.systemTeal),
  22. guidanceColors: GuidanceColors = GuidanceColors(),
  23. insulinTintColor: Color = .orange
  24. ) {
  25. // Delay initialization of dismissal closure pushed into SwiftUI Environment until after calling the designated initializer
  26. var dismiss = {}
  27. self.init(rootView: AnyView(rootView.environment(\.dismiss, { dismiss() })
  28. .environment(\.carbTintColor, carbTintColor)
  29. .environment(\.glucoseTintColor, glucoseTintColor)
  30. .environment(\.guidanceColors, guidanceColors)
  31. .environment(\.insulinTintColor, insulinTintColor)))
  32. switch dismissalMode {
  33. case .modalDismiss:
  34. dismiss = { [weak self] in self?.dismiss(animated: true) }
  35. case .pop(to: let PredecessorViewController):
  36. dismiss = { [weak self] in
  37. guard
  38. let navigationController = self?.navigationController,
  39. let predecessor = navigationController.viewControllers.last(where: { $0.isKind(of: PredecessorViewController) })
  40. else {
  41. return
  42. }
  43. navigationController.popToViewController(predecessor, animated: true)
  44. }
  45. }
  46. self.onDisappear = onDisappear
  47. self.isModalInPresentation = isModalInPresentation
  48. }
  49. public override func viewWillDisappear(_ animated: Bool) {
  50. super.viewWillAppear(animated)
  51. onDisappear()
  52. }
  53. }