Как сбросить вкладку (или контроллер вкладок) 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.
}