16 votes

Comment supprimer par programme un élément de la barre d'onglets créé dans le fichier NIB de la classe parent ?

Dans mon application iPhone, je dispose d'une barre d'onglets commune avec les éléments suivants trois onglets qui est présenté sous plusieurs angles après avoir appuyé sur un bouton. L'approche que j'ai suivie est le flux de travail de l'application Tweetie, décrit dans Poste Robert Conn .

Notez que le contrôleur principal est un contrôleur de navigation ; la barre d'onglets est placée dans le fichier NIB d'un contrôleur de vue de la pile de navigation, et l'effet du passage d'un onglet à l'autre est traité dans une méthode déléguée 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

Puisque les vues de la barre d'onglets doivent être personnalisées en fonction du contrôleur de vues d'où provient l'application, j'ai fait ceci GameTabBarController une classe parent avec ce fichier NIB qui ont la barre d'onglet. Ensuite, j'ai créé plusieurs classes enfants :

@interface FirstGameTabBarController : GameTabBarController {
  ...   
}

@interface SecondGameTabBarController : GameTabBarController {
  ...   
}

...

Mon problème est que dans certaines des classes enfants, je voudrais supprimer le troisième onglet du fichier NIB associé à la classe parent. Mais comme il n'y a pas de UITabBarController impliqué, je ne peux pas suivre les approches typiques que l'on peut trouver sur le web, c'est-à-dire supprimer le contrôleur de vue de l'élément de la barre d'onglets.

Comment puis-je faire ça ? Est-il possible de supprimer des éléments qui ont été précédemment ajoutés dans un fichier NIB ?

Merci !

UPDATE La solution était si facile... Je dois juste remplacer les éléments de la barre d'onglets, au lieu des contrôleurs de vue :

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

Merci à @Praveen S de m'avoir indiqué la bonne direction.

46voto

Kennet Jacob Points 596

Le code suivant a la solution :

NSMutableArray *tbViewControllers = [NSMutableArray arrayWithArray:[self.tabBarController viewControllers]];
[tbViewControllers removeObjectAtIndex:2];
[self.tabBarController setViewControllers:tbViewControllers];

8voto

mourodrigo Points 1413

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])
}

8voto

pableiros Points 4682

Voici ce que cela donne pour moi Swift 4 et 5

  1. Créez un UITabBarController classe.
  2. Attribuez la fonction personnalisée UITabBarController à la vue sur le storyboard.
  3. Retirer le UIViewController en viewDidLoad :

    class TabViewController: UITabBarController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            self.viewControllers?.remove(at: 1)
        }
    }

2voto

Praveen S Points 7978

Vous pouvez conserver une référence à cet objet barre d'onglets dans votre classe et effectuer les actions souhaitées sur celui-ci.

IBOutlet <Type> name;

Connectez-le via Interface builder et vous pouvez effectuer des actions, et dans votre cas, vous pouvez penser à le supprimer de la vue supérieure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X