Iphone app - определить, какой элемент панели табуляции был нажат
У меня есть приложение на основе панели вкладок с более чем 5 элементами панели табуляции, поэтому я получаю 4 из них, которые непосредственно отображаются в представлении, а остальные доступны, выбирая вкладку "Дополнительно". Когда нажимается элемент панели вкладок, я хочу определить, какой из них был.
Итак, в
- (void)tabBarController:(UITabBarController *)tabBarCtrl didSelectViewController:(UIViewController *)viewController
, я использую tabBarCtrl.selectedViewController.title
, чтобы получить заголовок элемента.
Это работает для вкладок, видимых в представлении - это первая вкладка "4" и "Дополнительно", но не работает для остальных элементов панели вкладок, которые отображаются в списке после нажатия вкладки "Дополнительно".
Я вижу, что метод didSelectViewController даже не вызывается при выборе вкладки из списка "Дополнительно".
Как я могу обнаружить любой из них при нажатии?
Спасибо заранее.
Ответы
Ответ 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, вы можете указать свой собственный объект в качестве делегата панели вкладок, и делегат будет получать сообщения всякий раз, когда выбранный элемент изменяется.