5

Voglio uno stack di navigazione globale. Quando l'utente cambia scheda o naviga verso una nuova vista nella stessa scheda, voglio spingere la nuova vista sullo stack di navigazione globale. Voglio il pulsante Indietro nella barra di navigazione per tornare alla vista precedente, che a volte è una scheda diversa e, a volte, una vista diversa nella stessa scheda.Come posso creare uno stack di navigazione globale?

enter image description here

+1

La risposta di Peter (in basso) funzionerà .. ma questa interfaccia utente suona molto "Android". Gli utenti si aspettano che una barra delle schede funzioni come una barra delle schede ... funziona come nessun'altra app che io abbia mai usato e andrà contro le aspettative degli utenti (cattive). C'è un'altra interfaccia utente che potresti usare per ottenere lo stesso effetto? – nielsbot

+0

inoltre, a mio parere, l'app di Yelp ha un'interfaccia utente errata e non deve essere utilizzata come esempio :) – nielsbot

risposta

0

si potrebbe ottenere lo stesso impostando il pulsante della barra a sinistra della UINavigationController come il pulsante di vostra scelta, Maneggiare il metodo di azione e richiamare il tasto appropriato sulla barra delle linguette evento click.

Hai bisogno di fare tutto ciò che nel vostro controller della vista root ...

aggiunto:

Non si poteva ottenere il tasto back sui controller di vista principale (controller di navigazione; s vista radice associato con l'istanza di tabbar) semplicemente premendo il pulsante della barra delle linguette.

è necessario trovare il modo per ottenere questo come non si ottiene questo da iOS Quindi il movimento si preme il pulsante della barra delle Tabelle il vostro bisogno di avere la variabile che memorizza l'indice selezionato precedente e un metodo che fornisce le informazioni per qualsiasi barra laterale semplicemente passando l'indice ... Quindi, utilizzando questi due è possibile impostare il titolo del pulsante della barra di sinistra della barra di navigazione e tornare alla scheda precedente assegnando il metodo di azione appropriato al pulsante della barra sinistra ...

+0

Non ho capito cosa intendi? –

+0

@ZiadTamim: vedere la risposta aggiornata .. – Jhaliya

4

Per ottenere questo effetto, è possibile abbandonare UITabBarController ed emulare la barra utilizzando una visualizzazione personalizzata o personalizzando la barra UIT standard.

Avere un controller di navigazione con, con la barra degli strumenti personalizzata sempre visibile, e quando i pulsanti vengono toccati su di esso, basta spingere le viste che si desidera sul navstack.

+0

Sì, è il comportamento predefinito standard –

+0

Erm ... quindi con cosa si stanno verificando problemi? –

+0

Voglio che tutti i UIViewController in UITabBarController vengano caricati nello stesso UINavigationController –

0

Si desidera che tutti gli UIViewController nello UITabBarController vengano caricati nello stesso UINavigationController?

Quindi qualcosa di simile:

  ___ RootViewController ___ 
     |       | 
UINavigationController  UITabBarViewController 

invece di

   RootViewController 
         | 
    _________ UITabbarViewController _____________________ 
    |       |       | 
UINavigationController UINavigationController UINavigationController 

Si dovrebbe provare "sperimentare" con il proprio personalizzato UITabBar

+0

Esiste qualche tutorial o qualcosa di utile (guida ...) che può aiutarmi a farlo? –

+0

È possibile creare la propria 'tabbar', che non è altro che un gruppo di pulsanti con lo stato desiderato 'selezionato'. Lo faccio sempre, perché "non mi piace" l'interfaccia utente della tabbar predefinita. – basvk

+0

Ma se voglio presentare un controller di visualizzazione modale, UITabBar non sarà nascosto ... –

0

vi consiglio di creare un array globale (NSMutableArray) che manterrà oggetti NSInvocation. Pertanto, ogni volta che si preme il controller di visualizzazione, è necessario creare NSInvocation con il controller di navigazione come destinazione e popViewConrollerAnimated: come selettore. Se si sta toccando l'elemento della barra delle schede, è necessario impostare il controller della barra delle schede come destinazione e setSelectedViewController: come selettore. Si dovrebbe anche specificare controller della vista corrente come parametro utilizzando

- (void)setArgument:(void *)buffer atIndex:(NSInteger)index 

Poi ogni volta che si pop tuo stack globale è necessario chiamare [myLastInvocation invoke];

0

Ho avuto problemi simili.L'ho fatto in questo modo:

Per cambiare la scheda, utilizzare: dite, volete andare a scheda 2 e la sua 3 ° View Controller

self.tabBarController.selectedIndex = 2; 

[self.tabBarController.delegate tabBarController:self.tabBarController didSelectViewController: 
    [[[self.tabBarController.viewControllers objectAtIndex:2] viewControllers] objectAtIndex:3]]; 
+0

Puoi spiegare di più la tua idea per favore? :) –

0

ho capito di lavoro. Nella mia esperienza avevo bisogno di avere mainTabBarController e detailedNavigationController come due controller di root. Questi due metodi di UIApplicationDelegate classe lavoro perfetto:

- (void) showDetailedTab 
{ 
    CGRect normalRect = self.window.bounds; 
    CGRect rightRect = CGRectOffset(normalRect, normalRect.size.width, 0); 
    CGRect leftRect = CGRectOffset(normalRect, -normalRect.size.width, 0); 

    detailedNavigationController.view.frame = rightRect; 
    mainTabBarController.view.frame = normalRect; 
    [self.window addSubview:mainTabBarController.view]; 
    [self.window addSubview:detailedNavigationController.view]; 

    [UIView animateWithDuration:0.35 delay:0.0 options:UIViewAnimationCurveEaseOut 
        animations: ^{ 
         detailedNavigationController.view.frame = normalRect; 
         mainTabBarController.view.frame = leftRect; 
        } 
        completion: ^(BOOL finished){ 
         [mainTabBarController.view removeFromSuperview]; 
        }]; 
} 

- (void) showMainTabBar 
{ 
    CGRect normalRect = self.window.bounds; 
    CGRect rightRect = CGRectOffset(normalRect, normalRect.size.width, 0); 
    CGRect leftRect = CGRectOffset(normalRect, -normalRect.size.width, 0); 

    mainTabBarController.view.frame = leftRect; 
    detailedNavigationController.view.frame = normalRect; 
    [self.window addSubview:mainTabBarController.view]; 
    [self.window addSubview:detailedNavigationController.view]; 

    [UIView animateWithDuration:0.35 delay:0.0 options:UIViewAnimationCurveEaseOut 
        animations: ^{ 
         mainTabBarController.view.frame = normalRect; 
         detailedNavigationController.view.frame = rightRect; 
        } 
        completion: ^(BOOL finished){ 
         [detailedNavigationController.view removeFromSuperview]; 
        }]; 
} 

penso che questa soluzione è meglio quindi emulando della barra delle schede, in quanto non si rompe il ciclo di vita UIViewContoller s'.