Как интегрировать popToRootViewControllerAnimated с моими вкладками? - PullRequest
1 голос
/ 20 декабря 2010

Я пытаюсь заставить одну из кнопок моей вкладки перейти в корень с помощью popToRootViewControllerAnimated.Мой вопрос: где я могу поставить этот код для его работы?Мои вкладки созданы с помощью Interface Builder ... они должны быть жестко запрограммированы, чтобы это работало?

Вот код, который я хочу использовать:

[self.navigationController popToRootViewControllerAnimated:YES];

Новый код в AppDelegate:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    if (viewController = HomeViewController) {
        [HomeViewController popToRootViewControllerAnimated:NO];
    }
}

Ответы [ 3 ]

7 голосов
/ 05 января 2011

Адам - ​​Я отказался от идеи подкласса, хотя она и сработала, поскольку есть гораздо более простой метод.

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    if ([viewController isKindOfClass:[UINavigationController class]]) {
        [(UINavigationController*)viewController popToRootViewControllerAnimated:YES];
    }
}

Это необходимый код.Я загрузил этот пример проекта , чтобы поиграть с ним.Основные моменты:

  • , делегат UITabBarController должен быть установлен на делегат приложения.
  • Делегат приложения должен реализовать протокол <UITabBarControllerDelegate>.
  • Делегат приложения должен реализовать приведенный выше код.

В примере проекта также показан один из способов выборочного выбора контроллеров навигации, с которыми это происходит.

0 голосов
/ 03 января 2015

Не знаю почему, но для меня на Xcode 6 с Swift это решение не сработало. Кажется, даже если didSelectViewController вызвано, popToRootViewControllerAnimated(false) нет.

Я обнаружил, что вместо этого у меня нормально работает shouldSelectViewController:

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {
    if viewController.isKindOfClass(UINavigationController) {
        (viewController as UINavigationController).popToRootViewControllerAnimated(false)
        return true
    }
    return true
}

Хотя не уверен, что это хороший подход.

0 голосов
/ 20 декабря 2010

Да, это должно быть жестко закодировано.

Если вы используете UITabBarController (я полагаю, вы, вероятно, так оно и есть), вам нужно будет создать его подкласс и переопределить.Это попытается перейти к корневому контроллеру представления каждого контроллера навигации на вкладке.Если корневой вид элемента вкладки не является элементом навигации, вы получите исключение.

@interface MyTabBarControllerSubClass : UITabBarController {
}
@end
@implementation MyTabBarControllerSubClass
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item {
    [super tabBar:tabBar didSelectItem:item];
    [(UINavigationController*)self.selectedViewController popToRootViewControllerAnimated:YES];
}
@end

Не забудьте выбрать свой подкласс в IB: -)

Вы можететакже сделать что-то UITabBarControllerDelegate.Хотя это, вероятно, будет сложнее реализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...