2011-10-04 11 views
15

Ho avuto qualche problema con qualcosa che pensavo potesse essere facile. Ho una tabella nel mio controller di visualizzazione radice, quando viene selezionata una riga, spingo una nuova vista e da lì vado in un'altra scheda.Pop alla vista principale quando è selezionata la scheda

La mia domanda è: come posso assicurarmi che non appena l'utente tocca la prima scheda, il controller di navigazione verrà visualizzato come root?

risposta

3
[self.navigationController popToRootViewControllerAnimated:NO]; 
+0

Cambiare animato a me NO effettivamente contribuito. Quando avevo impostato l'animazione su SÌ, la mia barra delle linguette e nessun altro pulsante nel controller di navigazione non funzionava. – Glogo

3

Quello che stai cercando di fare suona un po 'strano. Hai letto le linee guida dell'interfaccia umana sulla combinazione di UINavigationControllers e UITabBarControllers?

Tuttavia, ciò che è necessario fare è rilevare la selezione della scheda impostando un delegato per UITabBarController e implementando il metodo tabBarController: didSelectViewController: delegate. In questo metodo è necessario tornare al controller della vista radice utilizzando il metodo popToRootViewControllerAnimated di UINavigationController.

+0

Se esegui il checkout di Apple su Phone.app, il comportamento dei preferiti e della scheda recente è uguale a quello che l'OP desidera. –

+0

L'app Telefono non commuta le schede quando si seleziona una riga della tabella: questo era il comportamento che stavo interrogando, non scoppiando per eseguire il root quando l'utente tocca una scheda diversa. –

+0

Ah, sì, la domanda dell'OP non è interamente ciò che OP significa "da lì vado in un'altra scheda". L'utente seleziona un'altra scheda o l'app passa automaticamente. –

25

Il delegato seguente viene chiamato mentre ogni scheda è selezionata sulla barra delle linguette.

-(void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 

Inserire il seguente codice all'interno di questo metodo delegato.

if ([viewController isKindOfClass:[UINavigationController class]]) 
    { 
     [(UINavigationController *)viewController popToRootViewControllerAnimated:NO]; 
    } 

funziona correttamente sulla mia app.

+0

Grazie mille per me ha funzionato. –

+0

Sì, è proprio funzionante nella mia applicazione grazie – Pradeep

+0

Davvero molto utile per me, lavorando bene nella mia app secondo le mie esigenze. – ravinder521986

8

Per gli amanti della Swift:

import UIKit 

class YourTabBarControllerHere: UITabBarController, 
UITabBarControllerDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.delegate = self; 
    } 

    func tabBarController(tabBarController: UITabBarController, 
     didSelectViewController viewController: UIViewController) { 
      if let vc = viewController as? UINavigationController { 
       vc.popViewControllerAnimated(animated: false); 
      } 
    } 
} 

Edit: Swift 3 aggiornamento, grazie a @Justin Oroz per la segnalazione.

+0

Come domanda dell'OP per il controller ROOT, dovrebbe essere (nella sintassi Swift 3) 'vc.popToRootViewController (animato: falso)' –

0

In primo luogo, è necessario creare sottoclasse di UITabBarController e aggiungere Observer:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self.tabBar addObserver:self forKeyPath:@"selectedItem" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil]; 
} 

Quando si seleziona TabBar, provvederemo a elaborare nel metodo:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 
    if ([keyPath isEqualToString:@"selectedItem"] && [object isKindOfClass:[UITabBar class]]){ 
     UITabBar *bar = (UITabBar *)object; // The object will be the bar we're observing. 
     // The change dictionary will contain the previous tabBarItem for the "old" key. 
     UITabBarItem *wasItem = [change objectForKey:NSKeyValueChangeOldKey]; 
     NSUInteger was = [bar.items indexOfObject:wasItem]; 
     // The same is true for the new tabBarItem but it will be under the "new" key. 
     UITabBarItem *isItem = [change objectForKey:NSKeyValueChangeNewKey]; 
     NSUInteger is = [bar.items indexOfObject:isItem]; 
     if (is == was) { 
      UIViewController *vc = self.viewControllers[is]; 
      if ([vc isKindOfClass:[UINavigationController class]]) { 
       [(UINavigationController *)vc popToRootViewControllerAnimated:YES]; 
      } 
     } 
    } 
} 
0

L'UTabController suggerisce una UX diverso per lasciare un utente "pop to root". Quando si passa a una scheda, mantiene lo stack UINav completo di prima. Se toccano l'elemento della barra una seconda volta (toccando la scheda selezionata), solo allora lo fa apparire come root. È tutto automatico Alcune app, come instagram, consentono un terzo tocco per scorrere verso l'alto.

Suggerirei di attenersi ai valori predefiniti in quanto è ciò che gli utenti si attendono.

0

Il seguito aveva lavorato per me .Questo codice swift 3:

1> sottoclasse UITabBarController e implementare due sotto il metodo con un Ivar:
class MyTabBarController: UITabBarController ,UITabBarControllerDelegate { var previousSelectedTabIndex : Int = -1 }

2> impostare il delegato barra delle linguette in viewDidLoad

override func viewDidLoad() {  
    super.viewDidLoad() 
    self.delegate = self // you must do it} 

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { 

    self.previousSelectedTabIndex = tabBarController.selectedIndex 
}  
func tabBarController(_ tabBarController: UITabBarController, 
           shouldSelect viewController: UIViewController) -> Bool {  

    if self.previousSelectedTabIndex == tabBarController.selectedIndex { 
     let nav = viewController as! UINavigationController // mine in nav_VC 
     for vc in nav.childViewControllers { 
      if vc is YUOR_DESIRED_VIEW_CONTROLLER { 
      nav.popToViewController(vc, animated: true) 
      return false// IT WONT LET YOU GO TO delegate METHOD 
      } 
     } 
    } 
return true 
}  

tabBarController.selectedIndex ti danno la scheda selezionata

In modalità tabBarController_shouldSelect_viewController è possibile impostare il controller di visualizzazione desiderato con un semplice calcolo.
se non si ottiene il gioco codice di cui sopra sia con metodo di cui sopra e si arriva a sapere come sia lavorare insieme

2

In Swift 3.1

Aggiungi UITabBarControllerDelegate al TabBar Classe:

classe YourClass : UITabBarController, UITabBarControllerDelegate {

Dopo:

esclusione func TabBar (TabBar: UITabBar, didSelectItem voce: UITabBarItem) {

let yourView = self.viewControllers![self.selectedIndex] as! UINavigationController 
yourView .popToRootViewControllerAnimated(false) 

}

Problemi correlati