приложение для iphone - определить, какой элемент панели вкладок был нажат - PullRequest
18 голосов
/ 04 мая 2011

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

Это работает для вкладок, видимых в представлении - это первые 4 и вкладка «Еще», но не работает для остальных элементов панели вкладок, которые отображаются в списке после нажатия кнопки «»«Подробнее».

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

Заранее спасибо.

Ответы [ 7 ]

21 голосов
/ 04 мая 2011

Как получить заголовок 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;
    }
}
15 голосов
/ 04 мая 2011

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

self.tabBarController.selectedIndex;

Так что, если у вас есть, например, 6 пунктов, которые вы можете перейти на вкладку «Еще ...», выберите свой «5-й» элемент, и выбранный индекс будет 4 . Если вы перейдете на вкладку «Дополнительно» и выберите 6-й элемент, он вернет 5 .

<ч />

РЕДАКТИРОВАТЬ: Если вы хотите проверить текущую позицию некоторого UITabBarItem, вы можете сделать это:

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

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

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

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

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

5 голосов
/ 04 мая 2011

Вы можете определить, когда была нажата вкладка, используя методы 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); 
} 
3 голосов
/ 06 августа 2014

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 , вы можете следить за ответом Кена Песписа и iCoder в этом посте Кен Песписа и iCoder в этот пост.

2 голосов
/ 03 декабря 2015
- (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;

}

}
2 голосов
/ 22 июля 2015

Поскольку вы добавляете теги в свои КАЖДЫЙ 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
        }
    }
}
1 голос
/ 04 мая 2011

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

...