Удалить UITabBarItem


Как я могу удалить UITabBarItem из UITabBar?

Я ничего не пробовал, потому что не нашел ничего из Google searches или документации для UITabBar, UITabBarController, или UITabBarItem.

Заранее спасибо! :)

3 5

3 ответа:

UITabBar имеет коллекцию элементов NSArray. Поскольку свойство items является NSArray, а не NSMutableArray, вам придется построить новый NSArray из существующего, лишенного объекта, который вы хотите удалить, а затем установить свойство items в новый массив.

/* suppose we have a UITabBar *myBar, and an int index idx */
NSMutableArray modifyMe = [[myBar items] mutableCopy];
[modifyMe removeObjectAtIndex:idx];
NSArray *newItems = [[NSArray alloc] initWithArray:modifyMe];
[myBar setItems:newItems animated:true];

Совет Майка Кэронавызовет исключение , Если вы собираетесь изменить панель вкладок, принадлежащую контроллеру.

В iOS 3.0 и более поздних версиях вы не должны попытайтесь использовать методы и свойства этого класса для изменения панель вкладок, когда она связана с объект контроллера панели вкладок. Модифицирующий панель вкладок таким образом приводит к выбрасывание исключения. Вместо этого, любой модификации панели вкладок или ее элементов элементы должны происходить через панель вкладок интерфейс контроллера. Вы все еще можете непосредственно изменить объект панели вкладок, который не связан с панелью вкладок контроллер.

В этом случае self.tabBarItem=nil удалит его.

Примечание: это, кажется, не работает в iOS 11. Это все еще было хорошо в iOS 10.

Это умеренно ужасный ответ, на мой взгляд, отчасти потому, что он подрывает принципы человеческого интерфейса, но все равно он, кажется, работает чисто:

UITabBar *oldbar = self.tabBarController.tabBar;
UITabBar *newbar = [[UITabBar alloc] initWithFrame:CGRectMake(0,0,oldbar.frame.size.width,oldbar.frame.size.height)];
NSMutableArray *olditems = [[oldbar items] mutableCopy];
[olditems removeObjectAtIndex:0];
NSArray *newitems = [[NSArray alloc] initWithArray:olditems];
[newbar setItems:newitems animated:false];
[oldbar addSubview:newbar];

Это накладывает его чисто поверх старой панели вкладок, и он сохраняет свою функциональность.