2012-05-01 9 views
5

Ho implementato una soluzione UITabBar personalizzata per un progetto. In sostanza, se ci sono più di 5 elementi, utilizzo una scrollView che consentirà all'utente di scorrere gli altri elementi della scheda e di sopprimere il pulsante più. Un aspetto simile può essere visto nell'app Weather Channel.Elimina piùNavigationController in UITabBarController personalizzato

Ogni elemento della barra delle schede corrisponde a un UINavigationController che gestisce la pila di viste per ciascuna scheda. Il problema che sto avendo è quando ho più di 5 elementi della scheda, dalla scheda 5 in poi non mantiene correttamente lo stack di navigazione. Sembra che piùNavigationController uccida lo stack di navigazione ogni volta che si ritorna a quella scheda e si viene riportati nuovamente alla pagina iniziale.

ho sovrascritto il metodo setSelectedViewController come segue:

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

Questo codice rimuoverà il più funzionalità con il tasto di navigazione a sinistra, ma non risolve il problema di mantenere la pila di navigazione. Tutte le altre schede funzionano correttamente. Posso attraversare diverse viste e lo stack viene mantenuto dopo che me ne vado e tornare a quella scheda. Capisco che questo è un problema complicato, quindi per favore fatemi sapere se ci sono aree in cui posso fornire chiarezza. Grazie!

risposta

5

Questo è come ho finito per fissare questo:

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

Fondamentalmente ogni scheda da 5 su prende il controller di navigazione sostituito dal moreNavigationController quando si impostano le intiially viewControllers su UITabBarController. Pertanto, ho impostato dinamicamente viewControllers per contenere solo la scheda su cui faccio clic. Non c'è mai più di 1 in questo caso, quindi piùNavigationController non entra in gioco.

Quando avvio il mio controller personalizzato, fornisco solo la prima scheda come viewControllers in modo che l'applicazione possa essere caricata.

- (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]; 
} 

Per chiarezza, il delegato TabBar è impostato a questa classe in modo che possa rispondere ai clic tab. Il metodo delegato è il seguente:

- (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

Ho fatto questo un po 'diversamente, ma ho usato il tuo concetto di posizionare solo il primo ViewController e caricare tutti gli altri dinamicamente. Ben fatto! – Marquis103

Problemi correlati