Предотвращение автоматического popToRootViewController при двойном касании UITabBarController
Поведение UITabBarController по умолчанию заключается в том, чтобы вытащить содержащийся UINavigationController в контроллер корневого представления, когда вторая вкладка используется во второй раз. У меня есть конкретный случай использования, когда я хочу, чтобы это не работало автоматически, и мне сложно определить, как это предотвратить.
Кто-нибудь сталкивался с этим, и если да, то чем вы занимались? Нужно ли мне подклассифицировать UINavigationController и переопределить popToRootViewController или есть более простой способ?
Ответы
Ответ 1
Используйте tabBarController:shouldSelectViewController: метод протокол UITabBarControllerDelegate.
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
return viewController != tabBarController.selectedViewController;
}
Не забудьте установить делегат контроллера панели вкладок для объекта, который фактически реализует этот метод делегата.
Ответ 2
вот что я сделал:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
if ([[tabBarController viewControllers] objectAtIndex:[tabBarController selectedIndex]] == viewController)
return NO;
return YES;
}
рассматривает
Ответ 3
Это поведение немного странно, но удобный ярлык в случае глубокой иерархии!
Вы можете реализовать следующие методы UITabBarControllerDelegate, чтобы отключить ярлык этой системы:
#pragma mark -
#pragma mark UITabBarControllerDelegate
- (BOOL)tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc {
UIViewController *tbSelectedController = tbc.selectedViewController;
if ([tbSelectedController isEqual:vc]) {
return NO;
}
return YES;
}
Ответ 4
Вот версия Swift 3:
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
return viewController != tabBarController.selectedViewController
}