2011-05-06 7 views
9

Dentro de mi aplicación de iPhone tengo una barra de pestañas común con tres pestañas que se presentan desde varias vistas después de presionar un botón. El enfoque que seguí fue el flujo de trabajo de la aplicación Tweetie, que se describe en Robert Conn post.¿Cómo eliminar mediante programación un elemento de la barra de pestañas creado en el archivo NIB de la clase principal?

Tenga en cuenta que el controlador principal es un controlador de navegación; la barra de pestañas se coloca en el archivo NIB de una controladora de vista de la pila de navegación, y el efecto de alternar entre pestañas se maneja en un delegado método 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 

Desde el punto de vista de la barra de pestañas debe ser personalizado de acuerdo con el controlador de vista de la aplicación viene, he hecho de esto una clase padre GameTabBarController con ese archivo SEMILLA que tiene la barra de pestañas. A continuación, he creado varias clases de niños:

@interface FirstGameTabBarController : GameTabBarController { 
    ... 
} 

@interface SecondGameTabBarController : GameTabBarController { 
    ... 
} 

... 

Mi problema es que en algunas de las clases de los niños me gustaría quitar la tercera pestaña del archivo SEMILLA asociado con la clase padre. Pero como no hay UITabBarController involucrado, no puedo seguir los enfoques típicos que puede encontrar en la web, es decir, eliminar el controlador de vista del elemento de la barra de pestañas.

¿Cómo puedo hacer eso? ¿Es posible eliminar elementos que se han agregado previamente en un archivo NIB?

Gracias!

ACTUALIZACIÓN La solución fue tan fácil ... Tengo sólo para reemplazar los elementos de la barra pestaña, en lugar de los controladores de vista:

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

Gracias a @Praveen S por señalarme en la derecha dirección.

Respuesta

32

El siguiente código tiene la solución:

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

Esto todavía funciona en iOS11, a diferencia de algunos otros hacks feos.^_ ^ –

1

Puede mantener una referencia a ese objeto de barra de pestañas en su clase y realizar las acciones deseadas en él.

IBOutlet <Type> name; 

Conéctelo a través de Interface Builder y puede realizar acciones, y en su caso, puede que esté pensando en eliminarlo de la supervista.

+0

Me apuntan en la dirección correcta, aunque su respuesta no era exactamente lo que estaba buscando. Estoy actualizando la pregunta para publicar lo que finalmente hice. – elitalon

+0

No se puede eliminar un 'UITabBarItem' de su supervista directamente porque es un' UIBarItem', que hereda de 'NSObject', no' UIView'. Debería iterar sobre las subvistas de 'UITabBar' y descubrir cuál corresponde al' UITabBarItem', que probablemente requeriría API privadas. – devios1

3

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