Kaynağa Gözat

fix programmatically switching between tabs

cyberta 4 yıl önce
ebeveyn
işleme
cfec2394fc

+ 1 - 1
deltachat-ios/AppDelegate.swift

@@ -475,7 +475,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
         locationManager.reloadDcContext()
         notificationManager.reloadDcContext()
         if dcAccounts.getSelected().isConfigured() {
-            appCoordinator.presentTabBarController()
+            appCoordinator.resetTabBarRootViewControllers()
         } else {
             appCoordinator.presentWelcomeController()
         }

+ 24 - 17
deltachat-ios/Coordinator/AppCoordinator.swift

@@ -21,20 +21,16 @@ class AppCoordinator {
     }()
 
     // MARK: - tabbar view handling
-    private var qrNavController = UINavigationController()
-    private var chatsNavController = UINavigationController()
-    private var settingsNavController = UINavigationController()
-    private var tabBarController = UITabBarController()
-    private func createTabBarController() -> UITabBarController {
-        qrNavController = createQrNavigationController()
-        chatsNavController = createChatsNavigationController()
-        settingsNavController = createSettingsNavigationController()
+    lazy var tabBarController: UITabBarController = {
+        let qrNavController = createQrNavigationController()
+        let chatsNavController = createChatsNavigationController()
+        let settingsNavController = createSettingsNavigationController()
         let tabBarController = UITabBarController()
         tabBarController.delegate = appStateRestorer
         tabBarController.viewControllers = [qrNavController, chatsNavController, settingsNavController]
         tabBarController.tabBar.tintColor = DcColors.primary
         return tabBarController
-    }
+    }()
 
     private func createQrNavigationController() -> UINavigationController {
         let root = QrPageController(dcContext: dcAccounts.getSelected())
@@ -90,17 +86,21 @@ class AppCoordinator {
 
     func showChat(chatId: Int, msgId: Int? = nil, animated: Bool = true, clearViewControllerStack: Bool = false) {
         showTab(index: chatsTab)
-        if let rootController = self.chatsNavController.viewControllers.first as? ChatListController {
+
+        if let rootController = self.tabBarController.selectedViewController as? UINavigationController {
             if clearViewControllerStack {
-                self.chatsNavController.popToRootViewController(animated: false)
+                rootController.popToRootViewController(animated: false)
+            }
+            if let controller = rootController.viewControllers.first as? ChatListController {
+                controller.showChat(chatId: chatId, highlightedMsg: msgId, animated: animated)
             }
-            rootController.showChat(chatId: chatId, highlightedMsg: msgId, animated: animated)
         }
     }
 
     func handleQRCode(_ code: String) {
         showTab(index: qrTab)
-        if let topViewController = qrNavController.topViewController,
+        if let navController = self.tabBarController.selectedViewController as? UINavigationController,
+           let topViewController = navController.topViewController,
             let qrPageController = topViewController as? QrPageController {
             qrPageController.handleQrCode(code)
         }
@@ -126,14 +126,21 @@ class AppCoordinator {
     }
 
     func presentTabBarController() {
-        window.rootViewController = createTabBarController()
+        window.rootViewController = tabBarController
         showTab(index: chatsTab)
         window.makeKeyAndVisible()
     }
 
     func popTabsToRootViewControllers() {
-        qrNavController.popToRootViewController(animated: false)
-        chatsNavController.popToRootViewController(animated: false)
-        settingsNavController.popToRootViewController(animated: false)
+        self.tabBarController.viewControllers?.forEach { controller in
+            if let navController = controller as? UINavigationController {
+                navController.popToRootViewController(animated: false)
+            }
+        }
+    }
+
+    func resetTabBarRootViewControllers() {
+        self.tabBarController.setViewControllers([createQrNavigationController(), createChatsNavigationController(), createSettingsNavigationController()], animated: false)
+        presentTabBarController()
     }
 }