iphone - bar - navigation controller swift 4
Controlador de la barra de pestañas dentro de un controlador de navegación, o compartir una vista de la raíz de navegación (9)
Estoy tratando de implementar una interfaz de usuario estructurada como en la aplicación Tweetie , que se comporta de la siguiente manera: el controlador de vista de nivel superior parece ser un controlador de navegación, cuya vista de raíz es una vista de tabla "Cuentas". Si hace clic en cualquier cuenta, pasa al segundo nivel, que tiene una barra de pestañas en la parte inferior. Cada elemento de tabulación muestra una lista diferente y le permite profundizar más (los niveles subsiguientes no muestran la barra de pestañas).
Entonces, parece que la jerarquía de implementación es:
UINavigationController
- Cuentas :
UITableViewController
-
UITabBarController
- Tweets :
UITableViewController
- Vista detallada de un tweet / usuario / etc.
- Respuestas :
UITableViewController
- ...
- Tweets :
- Cuentas :
Esto parece funcionar [^ 1], pero parece ser incompatible según la documentación del SDK para -pushViewController:animated:
(énfasis añadido):
viewController : el controlador de vista que se inserta en la pila. No puede ser una instancia de controlador de barra de pestañas.
Me gustaría evitar las API privadas y similares, pero no estoy seguro de por qué este uso está explícitamente prohibido, incluso cuando parece funcionar bien. Alguien sabe el motivo?
He pensado en poner el controlador de barra de pestañas como el controlador principal, con cada una de las pestañas que contienen controladores de navegación separados. El problema con esto es que cada controlador de navegación necesita compartir un único controlador de vista raíz (es decir, la tabla "Cuentas" en Tweetie ); esto no parece funcionar: empujar el controlador de la tabla a un segundo controlador de navegación parece eliminarlo desde el principio. Por no hablar de todas las contabilidades al seleccionar una cuenta diferente, probablemente sería un dolor.
¿Cómo debo implementar esto de la manera correcta?
[^ 1]: el controlador de la barra de pestañas debe subclasarse para que el elemento de navegación del controlador de la barra de pestañas en ese nivel permanezca sincronizado con el elemento de navegación de la pestaña seleccionada, y los controladores de la tabla de pestañas individuales para empujar sus respectivas vistas de detalles a self.tabBarController.navigationController
lugar de self.navigationController
.
Así es como lo hice. Esto realmente está empujando un tabbarcontroller en el controlador de navegación. Funciona bien. No encontré en ninguna parte de la documentación que Apple no sea compatible de esta manera. ¿Alguien puede darme un enlace a esta advertencia?
Si esto es verdad, ¿es posible que Apple se niegue a publicar mi aplicación en Appstore?
-(void)setArrayAndPushNextController
{
MyFirstViewController *myFirstViewController = [[MyFirstViewController alloc] init];
MySecondViewController *mySecondViewController = [[MySecondViewController alloc] init];
myFirstViewController.array = self.array;
NSArray *array = [[NSArray alloc] initWithObjects:myFirstViewController, mySecondViewController, nil];
UITabBarController *tab = [[UITabBarController alloc] init];
tab.viewControllers = array;
[array release];
UITabBarItem *item1 = [[UITabBarItem alloc] initWithTitle:@"first title" image:nil tag:1];
UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"second title" image:nil tag:2];
myFirstViewController.tabBarItem = item1;
mySecondViewController.tabBarItem = item2;
[self stopAnimatingSpinner];
[self.navigationController pushViewController:tab animated:YES];
[tab release];
[item1 release];
[item2 release];
}
En mi aplicación, el controlador de vista raíz es un controlador UINavigation. En cierto punto de la aplicación, necesito mostrar una UITabBar. Traté de implementar una UITabBar en una UIView dentro de la jerarquía de navegación, como algunas de las publicaciones anteriores sugeridas, y esto funciona. Pero descubrí que quería más comportamiento predeterminado que el controlador de pestañas y encontré una forma de usar el UITabBarController con el controlador UINavigation:
1) Cuando quiero mostrar la vista de UITabBarController, hago esto:
MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.window.rootViewController = myUiTabBarControllerInstance;
2) Cuando quiero regresar a donde estaba en la jerarquía de navegación, hago esto:
appDelegate.window.rootViewController = myNavControllerInstance;
Es posible agregar una UITabBar a cualquier UIViewController. De esta forma, no tiene que presionar un UITabBarController y, por lo tanto, mantenerse dentro de los lineamientos de la API de Apple.
En el constructor de interfaces, UITabBar se encuentra en "Windows, Vistas y Barras" en la Biblioteca Cocoa Touch.
Escribí una publicación de blog sobre cómo me acerqué a este problema. Para mí, usar una vista modal era una solución más simple que escribir una implementación de barra de pestañas personalizada.
http://www.alexmedearis.com/uitabbarcontroller-inside-a-uinavigationcontroller/
Esto podría lograrse simplemente insertando el TabBarController en el Controlador de navegación. En el guión gráfico:
- Arrastra un ViewController
- Haga clic en la escena de ViewController
- Haga clic en el editor >> Insertar en >> Controlador de navegación.
- Arrastre un botón en el mismo ViewController.
- Arrastra un TabBarController
- Conecte el botón en ViewController al TabBarController a través de presionar Segue Action.
En este caso, solo RootViewController de TabBarController estaría en la pila del Controlador de navegación. Todos los elementos de TabBar tienen la barra de navegación en la parte superior y el usuario puede ir a la pantalla de inicio en cualquier momento, independientemente del TabBarItem seleccionado
Esto podría hacerse en cualquier ViewController en la pila del Controlador de navegación.
Si funciona, sugiéreme cómo aumentar la reputación para que pueda publicar las imágenes y el código en la siguiente respuesta. :)
Estoy construyendo una aplicación que usa un marco de navegación similar a Tweetie. He escrito una publicación sobre cómo hacer esto en mi blog www.wiredbob.com que también enlaza con el código fuente. Es una plantilla completa que puede tomar y utilizar como base para otro proyecto. ¡Buena suerte!
Estuve luchando durante la última hora para implementar una UITabBar
porque se ocultaba cuando intentaba mostrar mi vista; entonces encontré esta post :
Básicamente, asegúrese de insertar su nueva vista debajo de la barra de pestañas, de acuerdo con esta línea de código:
[self.view insertSubview:tab2ViewController.view belowSubview:myTabBar];
Las dos respuestas anteriores lo hicieron bien: no uso UITabBarController
en Tweetie. Es bastante fácil escribir un XXTabBarController
personalizado (subclase simple de UIViewController
) que está feliz de ser empujado a una pila de controladores de navegación, pero aún vive según la filosofía de "ver el controlador". Cada "pestaña" en la vista específica de la cuenta ( Tweets
/ Replies
/ Messages
) es su propio controlador de vista, y en lo que a ellos respecta, se están intercambiando en la pantalla por un UITabBarController
.
Lo hago en un par de mis aplicaciones. El truco para agregar una barra de pestañas a una aplicación basada en navigationController es NO usar un TabBarController. Agregue una Barra de pestañas a la vista, haga que el controlador de vista para esa vista sea TabBarDelegate y responda a las selecciones del usuario en la barra de pestañas del código del controlador de vista.
Utilizo barras de pestañas para agregar vistas adicionales a la vista de la barra de pestañas como sub-vistas, para volver a cargar una vista de tabla con diferentes conjuntos de datos, para volver a cargar un UIPickerView, etc.