2011-05-06 26 views
9

在我的iPhone應用程序中,我有一個共同的標籤欄三個標籤這是從幾個視圖後按下一個按鈕後呈現。我遵循的方法是Tweetie應用程序的工作流程,如Robert Conn post中所述。如何以編程方式刪除在父類NIB文件中創建的標籤欄項目?

請注意,主控制器是一個導航控制器;標籤欄被放置在導航堆棧的視圖控制器的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代表指着我的權利方向。

回答

32

下面的代碼有解決方案:

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

這仍然適用於iOS11,不像其他一些醜陋的黑客。^_ ^ – 2017-09-29 00:22:42

1

您可以在類中保存對該選項卡欄對象的引用,並對其執行所需的操作。

IBOutlet <Type> name; 

通過接口構建器連接它,您可以執行操作,並在您的情況下,您可能會考慮從超級視圖中刪除它。

+0

你點我在正確的方向,但你的答案是不正是我一直在尋找。我正在更新問題以發佈我最終做的事情。 – elitalon 2011-05-06 10:17:53

+0

你不能直接從它的超級視圖中移除一個'UITabBarItem',因爲它是'UIBarItem',它從'NSObject'繼承,而不是'UIView'。你將不得不遍歷UITabBar的子視圖,並找出哪一個對應於'UITabBarItem',這可能需要私有API。 – devios1 2015-08-11 01:48:31

3

斯威夫特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]) 
} 
相關問題