controlador de la barra de pestañas dentro de un controlador de navegación, o compartir una vista raíz de navegación

StackOverflow https://stackoverflow.com/questions/576764

Pregunta

Estoy tratando de implementar una interfaz de usuario estructurado como en el Tweetie aplicación, que se comporta como tal: el controlador de vista de nivel superior parece ser un controlador de navegación, cuya vista raíz es un "Cuentas "vista de tabla. Si hace clic en cualquier cuenta, que va al segundo nivel, que tiene una barra de pestañas en la parte inferior. Cada elemento de ficha muestra una lista diferente y le permite desglosar aún más (los niveles posteriores no muestran la barra de pestañas).

Por lo tanto, esto parece la jerarquía de aplicación es:

  • UINavigationController
    1. Cuentas : UITableViewController
    2. UITabBarController
      1. Tweets : UITableViewController
        • Vista detallada de un tweet / usuario / etc
      2. Respuestas : UITableViewController
      3. ...

Esto parece funcionar [^ 1], pero parece ser no soportado de acuerdo con 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 APIs privadas y similares, pero no estoy seguro de por qué este uso está prohibido explícitamente, incluso cuando parece funcionar bien. Alguien sabe el motivo?

He pensado en poner el controlador de la barra de pestañas como el controlador principal, con cada una de las fichas que contienen los controladores de navegación por separado. El problema con esto es que cada controlador de navegación tiene que compartir un controlador de vista raíz única (es decir, la tabla "Cuentas" en Tweetie ) - esto no parece funcionar: empujando el controlador de tabla a una segundo controlador nav parece sacarlo de la primera. Por no hablar de todo el libro de mantenimiento de la hora de seleccionar una cuenta diferente, probablemente sería un dolor.

¿Cómo debo aplicar este el camino correcto?

[^ 1]: El controlador de la barra de pestañas debe ser una subclase de manera que elemento de navegación del controlador de la barra de pestañas en ese nivel se mantiene en sincronía con el elemento de navegación de la pestaña seleccionada, y la necesidad del controlador de la tabla de la pestaña individual a empujar a sus respectivas vistas de detalle a self.tabBarController.navigationController en lugar de self.navigationController.

¿Fue útil?

Solución

Las dos respuestas anteriores lo hizo bien - no uso UITabBarController en Tweetie. Es bastante fácil escribir un XXTabBarController personalizado (subclase llanura de UIViewController) que está feliz de quedarse relegados a un controlador de pila de navegación, pero aún vive por la filosofía "controlador de vista". Cada "pestaña" en la vista específica de la cuenta (Tweets / Replies / Messages) es su propio controlador de vista, y en la medida en que les corresponda que van a obtener cambiado de sitio en la pantalla por un UITabBarController llanura-ol.

Otros consejos

Estoy construyendo una aplicación que utiliza un marco de navegación similar a Tweetie. He escrito un post acerca de cómo hacer esto en mi blog www .wiredbob.com que también vincula al código fuente. Es una plantilla completa se puede tomar y utilizar como base para otro proyecto. Buena suerte!

Es posible añadir un UITabBar a cualquier UIViewController. De esa manera usted realmente no tiene que empujar un UITabBarController y por lo tanto permanecer dentro de las directrices de la API de Apple.

En interfaz del generador de UITabBar está bajo "Windows, Vistas y bares" en la Biblioteca de Cocoa Touch.

Lo hago en un par de mis aplicaciones. El truco para añadir una barra de pestañas para una aplicación basada en navigationController es no utilizar un tabBarController. Añadir una barra de pestañas a la vista, hacer que el controlador de vista para esa vista un TabBarDelegate y responder a las selecciones del usuario en la barra de pestañas en el código del controlador de vista.

Yo uso Tab Bares añadir vistas adicionales a la vista de la barra de pestañas como sub-puntos de vista, para recargar una vista de tabla con diferentes conjuntos de datos, para recargar un UIPickerView, etc.

He tenido problemas durante la última hora de implementar un UITabBar porque obtendría oculto cuando traté de mostrar mi punto de vista; Entonces, encontré este posterior :

Básicamente, asegúrese de insertar la nueva vista por debajo de la barra de pestañas, por esta línea de código:

[self.view insertSubview:tab2ViewController.view belowSubview:myTabBar];

En mi aplicación, el controlador de vista raíz es un controlador UINavigation. En un determinado momento de la aplicación, lo que necesito para mostrar un UITabBar. He intentado implementar un UITabBar en un UIView dentro de la jerarquía de navegación, ya que algunos de los mensajes anteriores sugirieron, y esto hace el trabajo. Pero descubrí que quería más del comportamiento por defecto que el controlador proporciona pestaña y he encontrado una manera de utilizar el UITabBarController con el controlador UINavigation:

1) Cuando quiero mostrar la vista de la UITabBarController, hago esto:

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.window.rootViewController = myUiTabBarControllerInstance;

2) Cuando quiero volver a donde estaba en la jerarquía de navegación, hago esto:

appDelegate.window.rootViewController = myNavControllerInstance;

Esta es la forma en que lo hice. Esto es en realidad empujando un tabBarController en control de navegación. Funciona bien. No he encontrado en cualquier parte de la documentación que Apple no admite esta manera. ¿Puede alguien darme un enlace a esta advertencia?

Si esto es verdad, ¿es posible que Apple se niega a publicar mi aplicación al 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];
}

Esto podría lograrse simplemente incrustando la tabBarController en el regulador de la navegación. En el guión gráfico:

  1. Arrastre un ViewController
  2. Haga clic en la escena del ViewController
  3. Haga clic en editor de >> >> incrustar en regulador de la navegación.
  4. Arrastre un botón en el mismo ViewController.
  5. Arrastre un tabBarController
  6. Conectar el botón de la ViewController a la tabBarController a través de empuje Segue Acción.

En este caso, sólo RootViewController del tabBarController estaría en la pila del controlador de navegación. Todos los TabBarItems tendrían la barra de navegación en la parte superior y el usuario puede ir a la pantalla principal en cualquier momento, independientemente de la TabBarItem seleccionado

Esto podría hacerse en cualquier ViewController en la pila del controlador de navegación.

Si funciona, por favor me sugieren cómo aumentar la reputación de modo que pueda enviar las imágenes y el código en la siguiente respuesta. :)

Me escribió una entrada de blog sobre cómo me acercaba a este problema. Para mí, usando una vista modal era una solución más simple que escribir una implementación personalizada pestaña-bar.

http://www.alexmedearis.com/uitabbarcontroller-inside-a-uinavigationcontroller /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top