问题
Within my iPhone application I have a common tab bar with three tabs that is presented from several views after pressing a button. The approach I followed was the workflow of Tweetie application, described in Robert Conn post.
Note that the main controller is a navigation controller; the tab bar is placed in a view controller's NIB file of the navigation stack, and the effect of switching between tabs is handled in a delegate didSelectItem method.
@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
Since the views of the tab bar must be customized according to the view controller the application came from, I have made this GameTabBarController
a parent class with that NIB file that have the tab bar. Then, I have created several children classes:
@interface FirstGameTabBarController : GameTabBarController {
...
}
@interface SecondGameTabBarController : GameTabBarController {
...
}
...
My problem is that in some of the children classes I would like to remove the third tab of the NIB file associated with parent class. But since there is no UITabBarController involved, I cannot follow typical approaches you can found on the web, i.e. removing the view controller of the tab bar item.
How can I do that? Is it possible to remove elements that has been previously added in a NIB file?
Thanks!!
UPDATE The solution was so easy... I have just to replace the tab bar items, instead of the view controllers:
NSMutableArray *items = [NSMutableArray arrayWithArray:self.tabBar.items];
[items removeObjectAtIndex:2];
[self.tabBar setItems:items];
Thanks to @Praveen S for pointing me in the right direction.
回答1:
The following code has the solution:
NSMutableArray *tbViewControllers = [NSMutableArray arrayWithArray:[self.tabBarController viewControllers]];
[tbViewControllers removeObjectAtIndex:2];
[self.tabBarController setViewControllers:tbViewControllers];
回答2:
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])
}
回答3:
This is what it works for me for Swift 4
- Create a custom
UITabBarController
class. - Assign the custom
UITabBarController
class to the view on storyboard. Remove the
UIViewController
onviewDidLoad
:class TabViewController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() self.viewControllers?.remove(at: 1) } }
回答4:
You can hold a reference to that tab bar object in your class and perform the desired actions on it.
IBOutlet <Type> name;
Connect it via Interface builder and you can perform actions, and in your case you may be thinking of removing it from superview.
来源:https://stackoverflow.com/questions/5909727/how-to-remove-programmatically-a-tab-bar-item-created-in-parent-class-nib-file