Как сбросить вкладку (или контроллер вкладок) UITabBarController, когда пользователь выбирает вкладку?

Swift: у меня есть UITabBarController, с 8 вкладками. Когда пользователь выбирает любую вкладку, включая дополнительную вкладку, я хочу сбросить содержимое выбранной вкладки, перейдя в контроллер rootView?

Как это можно сделать?

Я попытался сбросить контроллеры навигации в следующих методах, это работает для вкладок, которые видны внизу, но это не работает для More Вкладка.

tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) 

override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem)

4 ответа

Решение

Чистый способ сделать это:

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    let index = tabBarController.selectedIndex
    if index == NSNotFound || index > 4 {
        tabBarController.moreNavigationController.popToRootViewController(animated: false)
        return
    }
    let navController = tabBarController.viewControllers?[tabBarController.selectedIndex] as? UINavigationController
    navController?.popToRootViewController(animated: false)
}

Создайте собственный класс для вашего UITabViewContoller, установите делегата и поместите туда этот кусок кода.

Вы можете создать класс UITabBarController для вашего tabBar, и в этом классе ovveride метод didBelect tabBar из их при выборе любой вкладки, которую вы можете popViewController

 class TabBarViewController: UITabBarController {
        override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
            let navigationController1 =  self.viewControllers![0] as? UINavigationController
            navigationController1!.popViewController(animated: false)

            let navigationController2 =  self.viewControllers![1] as? UINavigationController
            navigationController2!.popToRootViewController(animated: false)


            let navigationController3 =  self.viewControllers![2] as? UINavigationController
            navigationController3!.popToRootViewController(animated: false)

            let navigationController4 =  self.viewControllers![3] as? UINavigationController
            navigationController4!.popToRootViewController(animated: false)

        }
}

Это сработало для меня.

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    guard let navigationController = tabBarController.viewControllers?[tabBarController.selectedIndex] as? UINavigationController else {
        return
    }

    navigationController.popToRootViewController(animated: false)
}

Чтобы полностью поддержать Moreсоздайте собственный класс, как показано ниже:

class Main_TabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.customizableViewControllers = []  //remove Edit from More (OPTIONAL)
    }

    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        if let index = tabBar.items?.firstIndex(of: item) {
            if let count = viewControllers?.count, count > 5, index == 4 {
                DispatchQueue.main.async {
                    self.moreNavigationController.popToRootViewController(animated: false)
                }
            } else if let vcs = viewControllers, let vc = vcs[index] as? UINavigationController {
                DispatchQueue.main.async {
                    vc.popToRootViewController(animated: false)
                }
            }
        }
    }

}

Использование viewControllers собственностью UITabbarController, viewControlers - это массив UIViewController для UITabbarController. Обмен / перемещение позиции просмотра контроллеров при выборе вкладки (контроллера).

Используйте метод делегата tabbar(controller) для выполнения этих операций, например:
Свифт 3

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    if var viewcontrollers = tabBarController.viewControllers {
        viewcontrollers.remove(at: tabBarController.selectedIndex)
        viewcontrollers.insert(viewController, at: 0)
        tabBarController.viewControllers = viewControllers
    }
}

Вы также можете использовать этот метод делегата, если у вас есть доступ к tabbarController, где вы реализовали.

func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
 // Write a similar code to exchange/move view controllers using tabbarController instance.       
}
Другие вопросы по тегам