From ab9cdc48ee14e575809561f625740668e09bdce4 Mon Sep 17 00:00:00 2001 From: Justin Mazzocchi <2831158+jzzocc@users.noreply.github.com> Date: Wed, 27 Jan 2021 19:58:23 -0800 Subject: [PATCH] Fix secondary navigation issue --- View Controllers/AddIdentityViewController.swift | 12 +++++++++++- View Controllers/MainNavigationViewController.swift | 8 +++++--- Views/AddIdentityView.swift | 5 ++++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/View Controllers/AddIdentityViewController.swift b/View Controllers/AddIdentityViewController.swift index 986c064..b688e69 100644 --- a/View Controllers/AddIdentityViewController.swift +++ b/View Controllers/AddIdentityViewController.swift @@ -9,6 +9,7 @@ import ViewModels final class AddIdentityViewController: UIViewController { private let viewModel: AddIdentityViewModel + private let rootViewModel: RootViewModel private let displayWelcome: Bool private let scrollView = UIScrollView() private let stackView = UIStackView() @@ -27,8 +28,9 @@ final class AddIdentityViewController: UIViewController { private let whatIsMastodonButton = UIButton(type: .system) private var cancellables = Set() - init(viewModel: AddIdentityViewModel, displayWelcome: Bool) { + init(viewModel: AddIdentityViewModel, rootViewModel: RootViewModel, displayWelcome: Bool) { self.viewModel = viewModel + self.rootViewModel = rootViewModel self.displayWelcome = displayWelcome super.init(nibName: nil, bundle: nil) @@ -214,6 +216,14 @@ private extension AddIdentityViewController { .compactMap { $0 } .sink { [weak self] in self?.present(alertItem: $0) } .store(in: &cancellables) + + // There is a situation adding an identity from secondary navigation in which + // setting presentingSecondaryNavigation = false on the navigation view model + // does not work and the old secondary navigation is presented over the new + // main navigation. This is a hack to fix it. + rootViewModel.$navigationViewModel.dropFirst() + .sink { [weak self] _ in self?.dismiss(animated: true) } + .store(in: &cancellables) } func initialDisplay() { diff --git a/View Controllers/MainNavigationViewController.swift b/View Controllers/MainNavigationViewController.swift index 8ce7dec..8adead5 100644 --- a/View Controllers/MainNavigationViewController.swift +++ b/View Controllers/MainNavigationViewController.swift @@ -8,7 +8,6 @@ final class MainNavigationViewController: UITabBarController { private let viewModel: NavigationViewModel private let rootViewModel: RootViewModel private var cancellables = Set() - private weak var presentedSecondaryNavigation: UINavigationController? init(viewModel: NavigationViewModel, rootViewModel: RootViewModel) { self.viewModel = viewModel @@ -56,6 +55,8 @@ final class MainNavigationViewController: UITabBarController { } private extension MainNavigationViewController { + static let secondaryNavigationViewTag = UUID().hashValue + func setupViewControllers(pending: Bool) { var controllers: [UIViewController] = [ TimelinesViewController( @@ -132,12 +133,13 @@ private extension MainNavigationViewController { let navigationController = UINavigationController(rootViewController: hostingController) - presentedSecondaryNavigation = navigationController + navigationController.view.tag = Self.secondaryNavigationViewTag + present(navigationController, animated: true) } func dismissSecondaryNavigation() { - if presentedViewController == presentedSecondaryNavigation { + if presentedViewController?.view.tag == Self.secondaryNavigationViewTag { dismiss(animated: true) } } diff --git a/Views/AddIdentityView.swift b/Views/AddIdentityView.swift index d8a5d66..16e536c 100644 --- a/Views/AddIdentityView.swift +++ b/Views/AddIdentityView.swift @@ -7,9 +7,12 @@ import ViewModels struct AddIdentityView: UIViewControllerRepresentable { let viewModelClosure: () -> AddIdentityViewModel let displayWelcome: Bool + @EnvironmentObject var rootViewModel: RootViewModel func makeUIViewController(context: Context) -> AddIdentityViewController { - AddIdentityViewController(viewModel: viewModelClosure(), displayWelcome: displayWelcome) + AddIdentityViewController(viewModel: viewModelClosure(), + rootViewModel: rootViewModel, + displayWelcome: displayWelcome) } func updateUIViewController(_ uiViewController: AddIdentityViewController, context: Context) {