2012-05-01 14 views
5

Implementé una solución UITabBar personalizada para un proyecto. Esencialmente, si hay más de 5 elementos, utilizo un scrollView que permitirá al usuario desplazarse por los elementos de pestañas adicionales y suprime el botón más. Una apariencia similar se puede ver en la aplicación Weather Channel.Suprimir másNavigationController en UITabBarController personalizado

Cada elemento de la barra de pestañas corresponde a un UINavigationController que administra la pila de vistas para cada pestaña. El problema que tengo es cuando tengo más de 5 elementos de pestaña, desde la pestaña 5 en adelante no mantiene correctamente la pila de navegación. Parece que el control de navegación más mata la pila de navegación cada vez que regresas a esa pestaña y vuelves a la página inicial.

hemos anulado el método setSelectedViewController de la siguiente manera:

- (void) setSelectedViewController:(UIViewController *)selectedViewController { 
    [super setSelectedViewController:selectedViewController]; 
    if ([self.moreNavigationController.viewControllers count] > 1) { 
     self.moreNavigationController.viewControllers = [[NSArray alloc] initWithObjects:self.moreNavigationController.visibleViewController, nil]; 
    } 
} 

Este código se eliminará el más funcionalidad en el botón de navegación izquierda, pero no resuelve el problema de mantener la pila de navegación. Todas las demás pestañas funcionan bien. Puedo recorrer varias vistas y la pila se mantiene después de que salgo y regrese a esa pestaña. Entiendo que este es un tema complicado, por lo tanto, avíseme si hay áreas donde pueda brindar claridad. ¡Gracias!

Respuesta

5

Ésta es la forma en que terminó la fijación de este:

- (void) setSelectedViewController:(UIViewController *) selectedViewController { 
    self.viewControllers = [NSArray arrayWithObject:selectedViewController]; 
    [super setSelectedViewController:selectedViewController]; 
} 

Básicamente cualquier ficha de 5 en obtiene su controlador de navegación reemplazado por el moreNavigationController cuando intiially configurar los viewControllers en UITabBarController. Por lo tanto, establecí dinámicamente viewControllers para que solo contenga la pestaña en la que estoy haciendo clic. En este caso, nunca termina siendo más de 1, por lo que el controlador de navegación no entra en juego.

Cuando inicio mi controlador personalizado, solo proporciono la primera pestaña como viewControllers para que la aplicación pueda cargar.

- (id) init { 
    self = [super init]; 
    if (self) { 
     self.delegate = self; 
     [self populateTabs]; 
    } 
    return self; 
} 

- (void) populateTabs { 
    NSArray *viewControllers = [self.manager createViewsForApplication]; 
    self.viewControllers = [NSArray arrayWithObject:[viewControllers objectAtIndex:0]]; 
    self.tabBar.hidden = YES; 
    MyScrollingTabBar *tabBar = [[MyScrollingTabBar alloc] initWithViews:viewControllers]; 
    tabBar.delegate = self; 
    [self.view addSubview:tabBar]; 
} 

Para mayor claridad, el delegado de barra de pestañas se establece en esta clase de modo que pueda responder a los clics de ficha. El método delegado es el siguiente:

- (void) tabBar:(id) bar clickedTab:(MyScrollingTabBarItem *) tab { 
     if (self.selectedViewController == tab.associatedViewController) { 
     [(UINavigationController *) tab.associatedViewController popToRootViewControllerAnimated:YES]; 
    } else { 
     self.selectedViewController = tab.associatedViewController; 
    } 
    // keep nav label consistent for tab 
    self.navigationController.title = tab.label.text; 
} 
+1

Hice esto de una manera bastante diferente, pero utilicé su concepto de colocar solo el primer ViewController y cargar todos los demás dinámicamente. ¡Bien hecho! – Marquis103

Cuestiones relacionadas