如何以编程方式删除在父类NIB文件中创建的选项卡栏项?

eli*_*lon 14 iphone nib uitabbaritem uitabbar ios4

在我的iPhone应用程序中,我有一个公共标签栏,其中有三个标签,按下按钮后可以从多个视图中显示.我遵循的方法是Tweetie应用程序的工作流程,在Robert Conn的帖子中描述.

注意,主控制器是导航控制器; 标签栏放置在导航堆栈的视图控制器的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
Run Code Online (Sandbox Code Playgroud)

由于必须根据应用程序来自的视图控制器来自定义选项卡栏的视图,因此我将其GameTabBarController作为具有该选项卡栏的NIB文件的父类.然后,我创建了几个子类:

@interface FirstGameTabBarController : GameTabBarController {
  ...   
}

@interface SecondGameTabBarController : GameTabBarController {
  ...   
}

...
Run Code Online (Sandbox Code Playgroud)

我的问题是,在某些子类中,我想删除与父类关联的NIB文件的第三个选项卡.但由于没有涉及UITabBarController,我无法按照您在网络上找到的典型方法,即删除标签栏项目的视图控制器.

我怎样才能做到这一点?是否可以删除先前在NIB文件中添加的元素?

谢谢!!

更新 解决方案非常简单......我只需更换标签栏项目,而不是视图控制器:

NSMutableArray *items = [NSMutableArray arrayWithArray:self.tabBar.items];
[items removeObjectAtIndex:2];
[self.tabBar setItems:items];
Run Code Online (Sandbox Code Playgroud)

感谢@Praveen S指出我正确的方向.

小智 42

以下代码具有以下解决方案:

NSMutableArray *tbViewControllers = [NSMutableArray arrayWithArray:[self.tabBarController viewControllers]];
[tbViewControllers removeObjectAtIndex:2];
[self.tabBarController setViewControllers:tbViewControllers];
Run Code Online (Sandbox Code Playgroud)


pab*_*ros 7

这就是它适用于Swift 4 和 5 的方法

  1. 创建自定义UITabBarController类。
  2. 将自定义UITabBarController类分配给故事板上的视图。
  3. 删除UIViewControllerviewDidLoad

    class TabViewController: UITabBarController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            self.viewControllers?.remove(at: 1)
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)


mou*_*igo 5

斯威夫特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])
}
Run Code Online (Sandbox Code Playgroud)