在我的iPhone应用程序中,我有一个带有三个选项卡的公共标签栏,按下按钮后会从多个视图中显示。我遵循的方法是Tweetie应用程序的工作流程,在Robert Conn post中描述。
请注意,主控制器是导航控制器;选项卡栏放置在导航堆栈的视图控制器的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文件中添加的元素?
谢谢!
更新 解决方案非常简单......我只需更换标签栏项目,而不是视图控制器:
NSMutableArray *items = [NSMutableArray arrayWithArray:self.tabBar.items];
[items removeObjectAtIndex:2];
[self.tabBar setItems:items];
感谢@Praveen S指出我正确的方向。
答案 0 :(得分:39)
以下代码有解决方案:
NSMutableArray *tbViewControllers = [NSMutableArray arrayWithArray:[self.tabBarController viewControllers]];
[tbViewControllers removeObjectAtIndex:2];
[self.tabBarController setViewControllers:tbViewControllers];
答案 1 :(得分:5)
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 :(得分:2)
对于 Swift 4
,这对我有用UITabBarController
类。UITabBarController
类分配给故事板上的视图。删除UIViewController
上的viewDidLoad
:
class TabViewController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
self.viewControllers?.remove(at: 1)
}
}
答案 3 :(得分:1)
您可以在班级中保留对该标签栏对象的引用,并对其执行所需的操作。
IBOutlet <Type> name;
通过“界面”构建器进行连接,您可以执行操作,在您的情况下,您可能会考虑将其从超级视图中删除。