Предотвратить автоматический popToRootViewController при двойном нажатии UITabBarController - PullRequest
32 голосов
/ 05 декабря 2009

Поведение UITabBarController по умолчанию заключается в извлечении содержащегося в нем UINavigationController в контроллер корневого представления при повторном нажатии определенной вкладки. У меня есть конкретный случай использования, когда я хочу, чтобы это не работало автоматически, и мне трудно понять, как это предотвратить.

Кто-нибудь сталкивался с этим, и если да, что ты делал? Нужно ли создавать подкласс UINavigationController и переопределять popToRootViewController или есть более простой способ?

Ответы [ 5 ]

63 голосов
/ 05 декабря 2009

Используйте tabBarController: shouldSelectViewController: метод протокола UITabBarControllerDelegate .

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
    return viewController != tabBarController.selectedViewController;
}

Не забудьте установить делегат контроллера панели вкладок для объекта, который фактически реализует этот метод делегата.

14 голосов
/ 13 мая 2010

вот что я сделал:

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 
{

    if ([[tabBarController viewControllers] objectAtIndex:[tabBarController selectedIndex]] == viewController)

            return NO;

    return YES;

}

привет

2 голосов
/ 30 августа 2018

Обновление Swift 4.1

Стоп Двойной тап для всех вкладок.

extension TabBarController: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    //for blocking double tap on all tabs.
    return viewController != tabBarController.selectedViewController
}}

Остановить двойное нажатие только на одной конкретной вкладке. Здесь это для 3-й вкладки.

extension TabBarController: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    //for blocking double tap on 3rd tab only
    let indexOfNewVC = tabBarController.viewControllers?.index(of: viewController)
    return ((indexOfNewVC != 2) ||
        (indexOfNewVC != tabBarController.selectedIndex))       
}}

Надеюсь, это поможет ...

Спасибо !!!

1 голос
/ 16 ноября 2010

Это поведение немного странное, но удобный способ в случае глубокой иерархии!

Вы можете реализовать следующие методы 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;
}
0 голосов
/ 09 марта 2017

Вот версия Swift 3:

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    return viewController != tabBarController.selectedViewController
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...