Как программно удалить элемент панели вкладок, созданный в файле NIB родительского класса? - PullRequest
11 голосов
/ 06 мая 2011

В моем приложении для iPhone у меня есть общая панель вкладок с тремя вкладками , которая отображается в нескольких видах после нажатия кнопки. Подход, который я использовал, был рабочим процессом приложения Tweetie, описанным в Пост Роберта Конна .

Обратите внимание, что основным контроллером является контроллер навигации; панель вкладок помещается в NIB-файл контроллера представления стека навигации, а эффект переключения между вкладками обрабатывается методом делегата didSelectItem.

@interface GameTabBarController : UIViewController<UITabBarDelegate> {
  UITabBar *tabBar;
  UITabBarItem *lastGameTabBarItem;
  UITabBarItem *previousGamesTabBarItem;
  UITabBarItem *myBetsTabBarItem;

  NSArray *viewControllers;
  UIViewController *currentViewController;
}

@implementation GameTabBarController
  ...

  - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item {
    UIViewController *viewController = nil;

    // Get the view controller linked to the tab bar item pressed
    ...

    // Switch to the view
    [self.currentViewController.view removeFromSuperview];
    [self.view addSubview:viewController.view];
    self.currentViewController = viewController;
  }

  ...
@end

Поскольку представления панели вкладок должны быть настроены в соответствии с контроллером представления, из которого пришло приложение, я сделал этот GameTabBarController родительским классом с этим файлом NIB, имеющим панель вкладок. Затем я создал несколько детских классов:

@interface FirstGameTabBarController : GameTabBarController {
  ...   
}

@interface SecondGameTabBarController : GameTabBarController {
  ...   
}

...

Моя проблема в том, что в некоторых дочерних классах я хотел бы удалить третью вкладку файла NIB, связанного с родительским классом. Но так как UITabBarController не задействован, я не могу следовать типичным подходам, которые вы можете найти в Интернете, то есть удалить контроллер представления элемента панели вкладок.

Как я могу это сделать? Можно ли удалить элементы, ранее добавленные в файл NIB?

Спасибо !!

UPDATE Решение было таким простым ... Мне нужно просто заменить элементы панели вкладок вместо контроллеров представления:

NSMutableArray *items = [NSMutableArray arrayWithArray:self.tabBar.items];
[items removeObjectAtIndex:2];
[self.tabBar setItems:items];

Спасибо @Praveen S за указание в правильном направлении.

Ответы [ 4 ]

40 голосов
/ 28 марта 2012

Следующий код имеет решение:

NSMutableArray *tbViewControllers = [NSMutableArray arrayWithArray:[self.tabBarController viewControllers]];
[tbViewControllers removeObjectAtIndex:2];
[self.tabBarController setViewControllers:tbViewControllers];
5 голосов
/ 16 августа 2017

Swift 4

func removeTab(at index: Int) {
    guard let viewControllers = self.tabBarController?.viewControllers as? NSMutableArray else { return }
    viewControllers.removeObject(at: index)
    self.tabBarController?.viewControllers = (viewControllers as! [UIViewController])
}
2 голосов
/ 20 апреля 2018

Это то, что у меня работает для Swift 4

  1. Создание пользовательского UITabBarController класса.
  2. Назначьте пользовательский класс UITabBarController представлению на раскадровке.
  3. Снимите UIViewController с viewDidLoad:

    class TabViewController: UITabBarController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            self.viewControllers?.remove(at: 1)
        }
    }
    
1 голос
/ 06 мая 2011

Вы можете хранить ссылку на этот объект панели вкладок в вашем классе и выполнять над ним необходимые действия.

IBOutlet <Type> name;

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

...