Подтвердить что ты не робот

Iphone app - определить, какой элемент панели табуляции был нажат

У меня есть приложение на основе панели вкладок с более чем 5 элементами панели табуляции, поэтому я получаю 4 из них, которые непосредственно отображаются в представлении, а остальные доступны, выбирая вкладку "Дополнительно". Когда нажимается элемент панели вкладок, я хочу определить, какой из них был. Итак, в - (void)tabBarController:(UITabBarController *)tabBarCtrl didSelectViewController:(UIViewController *)viewController, я использую tabBarCtrl.selectedViewController.title, чтобы получить заголовок элемента.

Это работает для вкладок, видимых в представлении - это первая вкладка "4" и "Дополнительно", но не работает для остальных элементов панели вкладок, которые отображаются в списке после нажатия вкладки "Дополнительно".

Я вижу, что метод didSelectViewController даже не вызывается при выборе вкладки из списка "Дополнительно".
Как я могу обнаружить любой из них при нажатии?

Спасибо заранее.

4b9b3361

Ответ 1

Как получить название UITabBarItem в разделе More?

- (void)tabBarController:(UITabBarController *)tabBarController 
 didSelectViewController:(UIViewController *)viewController
{
    NSLog(@"controller class: %@", NSStringFromClass([viewController class]));
    NSLog(@"controller title: %@", viewController.title);

    if (viewController == tabBarController.moreNavigationController)
    {
        tabBarController.moreNavigationController.delegate = self;
    }
}

Ответ 2

Вы можете получить доступ к индексу выбранного элемента, используя следующий код в UIViewController. Он будет всегда возвращать индекс вашей вкладки.

self.tabBarController.selectedIndex;

Итак, если у вас есть, например, 6 пунктов, которые вы можете перейти на вкладку "Дополнительно...", выберите свой "5-й" элемент, а selectedIndex будет 4. Если вы перейдете на вкладку "Дополнительно" и выберите 6-й элемент, он вернет 5.


EDIT: Если вы хотите проверить текущую позицию некоторого UITabBarItem, вы можете сделать это:

Во-первых, в вашем XIB файле вы должны отредактировать свойство tag каждой вкладки, так что 1-я вкладка будет иметь теги = 100, 2-й, 3-й и 3-й и т.д.

Затем в ViewController добавьте этот код:

UIViewController *selectedVC = [self.tabBarController.viewControllers objectAtIndex:self.tabBarController.selectedIndex];
int selectedItemTag = selectedVC.tabItem.tag;

Затем вы можете определить, что такое viewController, используя переменную selectedItemTag. В этом случае вы можете определить selectedIndex, выполнив следующие действия: selectedIndex = (selectedItemTag-100)/100.

Свойства tag изменяются при не при настройке вашего UITabBar, поэтому вы можете доверять им:)

Ответ 3

Вы можете обнаружить, когда табуляция была нажата с помощью методов UITabBarDelegate: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITabBarDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UITabBarDelegate

Вы можете сделать свой класс UITabBarController делегатом и добавить метод в реализацию:

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item 
{ 
    NSLog(@"tab selected: %@", item.title); 
} 

Ответ 4

1. Итак, если вы используете UITabBarController, вы можете сделать класс реализующим UITabBarControllerDelegate и назначить делегат UITabBarController классу, который должен быть уведомлен, когда TabBar выбранных элементов, затем добавьте метод делегата в ваш класс:

-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController

Внутри этого метода вы можете использовать свойство UITabBarController selectedIndex, чтобы узнать, какой текущий выбранный индекс:

-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:      (UIViewController *)viewController
{
    NSLog(@"Selected index: %d", tabBarController.selectedIndex);
}

2. Если вы не используете только UITabBar, вы можете ответить на этот вопрос здесь Ken Pespisa и iCoder в этом сообщении Ken Pespisa и iCoder в этом сообщении.

Ответ 5

Поскольку вы добавляете теги в свой КАЖДЫЙ UITabBarItem (даже те, у которых есть индекс 5 и более).

Вы можете отслеживать, какая вкладка была выбрана, используя следующий код:

//MARK: - UITabBarControllerDelegate

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {

    if viewController == tabBarController.moreNavigationController {
        tabBarController.moreNavigationController.delegate = self
    } else {
        setSelectedTabBarOption()
    }
}


//MARK: - UINavigationControllerDelegate

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
    setSelectedTabBarOption()
}


private func setSelectedTabBarOption() {

    if let viewControllers = viewControllers {
        let selectedController: UIViewController? = viewControllers.count > selectedIndex ? viewControllers[selectedIndex] : nil
        if let tag = selectedController?.tabBarItem.tag {
            //do whatever with your tag
        }
    }
}

Ответ 6

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{

 NSLog(@"Selected index: %d", tabBarController.selectedIndex);

if (viewController == tabBarController.moreNavigationController)
{
    tabBarController.moreNavigationController.delegate = self;
}

NSUInteger selectedIndex = tabBarController.selectedIndex;

switch (selectedIndex) {

    case 0:
        NSLog(@"click tabitem %u",self.tabBarController.selectedIndex);
        break;
    case 1:
        NSLog(@"click me again!! %u",self.tabBarController.selectedIndex);
        break;

    default:
        break;

}

}

Ответ 7

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