2010-11-06 5 views
9

Мое приложение имеет 3 элемента панели вкладок, каждый из которых отображается на отдельный контроллер представления. Моя проблема в том, что первым контроллером является контроллер UINavigation, и он сверлит вниз примерно на 3 уровня. У меня нет проблем с навигацией, но когда я нажимаю на другой элемент панели вкладок, а затем, когда я возвращаюсь к элементу первой панели вкладок (тот, у которого есть контроллер UINav), я бы предпочел, чтобы он вернулся к первый контроллер в навигационной последовательности.Сброс UINavigationController на первый контроллер при нажатии на панель вкладок

Я читал, что вы должны сделать что-то вроде:

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item 
{ 
    [[self navigationController] popViewControllerAnimated:NO]; 
} 

Но я не уверен, где я должен поставить этот метод. Кто является делегатом для контроллера панели вкладок? Он настроен в AppDelegate ... он должен туда попасть?

Спасибо.

ответ

12

Конечно, в вашем AppDelegate, когда вы создаете UITabBarController вы можете установить делегат на барном контроллере вкладки, чтобы быть самостоятельными (т.е. в AppDelegate). Затем вы можете поместить метод tabBar: didSelectItem: в AppDelegate, и он должен вызываться всякий раз, когда пользователь удаляет UITabBarItem. Я бы создал свойство переменной экземпляра в AppDelegate и сохранил ссылку на UITabBarItem, который используется для вкладки контроллера Nav (назовем это tabBarItemForNavControllerTab). Вы должны также иметь ссылку на контроллер нав, который живет в этой первой вкладке, так что вы можете контролировать его с AppDelegate (Давайте назовем его navControllerInFirstTab)

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item 
{ 
    if (item != self.tabBarItemForNavControllerTab) { 
     [self.navControllerInFirstTab popToRootViewControllerAnimated:NO]; 
    } 
}

Вы можете использовать popToRootViewControllerAnimated: на UINavigationController вместо выталкивать каждый из стека отдельно.

+0

Хм ... это имеет смысл, но я не могу получить tabBar: didSelectItem: ответить (у меня сейчас есть инструкция NSLog(), и ничего не появляется). Я установил [tabBarController setDelete: self]; но ничего. – rpheath

+2

Хорошо, я понял. Мне пришлось использовать '- (void) tabBarController: (UITabBarController *) tabBarController didSelectViewController: (UIViewController *) viewController' вместо этого. Благодаря! – rpheath

1

Вы должны установить себя в качестве делегата для TabBar и реализации - TabBar: didSelectItem: вы спросите навигационный контроллер для своих взглядов [[само navigationController] viewControllers], которая возвращает NSArray из UIViewControllers, затем поп каждый контроллер представления в массиве, пока не дойдете до корневого представления.

http://developer.apple.com/library/ios/#documentation/uikit/reference/UITabBarDelegate_Protocol/Reference/Reference.html

Смежные вопросы