Я добавляю значок к UITabBar своего UITabBarController как таковому:
UITabBarItem *tbi = (UITabBarItem *)[stTabBarController.tabBar.items objectAtIndex:1];
tbi.badgeValue = @"2";
Однако мой UITabBarController customizeable, таким образом, индекс может измениться. Как я могу удостовериться, что к значку относятся корректный UITabBarItem?
UITabBarItem *tbi = (UITabBarItem *)self.tabController.selectedViewController.tabBarItem;
tbi.badgeValue = @"New";
Также работает.
Я бы использовал свойство NSMutableDictionary в классе, которому принадлежит контроллер панели вкладок, связывая имена вкладок с позициями и метод для получения по имени:
-(UITabBarItem*)getTabByName:(NSString*)tabName {
return [stTabBarController.tabBar.items objectAtIndex:[[tabDict valueForKey:tabName] intValue]];
}
Инициализируйте словарь в вашей настройке код для каждой вкладки, поскольку в то время вы знаете индекс вкладки:
[tabDict setValue:[stTabBarController.tabBar.items objectAtIndex:1] forKey:@"myTabName"];
Одно из предложений, которое вы могли бы рассмотреть, - установить тег для каждого элемента панели вкладок. Вы можете сделать это в Интерфейсном Разработчике или при создании элемента по коду. Затем вы можете прокручивать контроллеры представления в контроллере панели вкладок, ища тот, у которого есть интересующий вас элемент панели вкладок. Например:
// #define MyTabBarItemTag 999
for (UIViewController *viewController in stTabBarController.viewControllers) {
if (viewController.tabBarItem.tag == MyTabBarItemTag) {
viewController.tabBarItem.badgeValue = @"2";
}
}
Сохраните ссылку на элемент панели вкладок, который вы хотите изменить.
EDIT в ответ на ваш запрос кода:
Я полагаю, что в вашем приложении есть одно место, где вы обновляете значки на элементах панели вкладок. Просто добавьте массив элементов панели вкладок (или отдельные элементы панели вкладок) в качестве члена(ов) этого класса (+ свойства, если необходимо) и обновляйте элементы напрямую, без выборки из текущего списка элементов панели вкладок ((UITabBarItem *)[stTabBarController.tabBar.items objectAtIndex:1];
).
Например, если вы решите хранить ссылки на элементы панели вкладок напрямую (без массива), то код может выглядеть так:
// Put the next code right after initiating the tab bar and/or after adding new tab bar items to it...
self.newsTabBarItem = (UITabBarItem *)[stTabBarController.tabBar.items objectAtIndex:1];
self.friendsTabBarItem = (UITabBarItem *)[stTabBarController.tabBar.items objectAtIndex:2];
// etc.