2012-06-14 11 views
5

Ho un imbattuto in un pezzo di codice al pop a un viewcontroller specifica in una pila di navigazione come di seguitoPopping ad una viewcontroller specifica in una pila di navigazione

for (UIViewController* viewController in self.navigationController.viewControllers) { 
    if ([viewController isKindOfClass:[MyGroupViewController class]]) { 
     MyGroupViewController *groupViewController = (MyGroupViewController*)viewController; 
     [self.navigationController popToViewController:groupViewController animated:YES]; 
    } 
} 

L'obiettivo è quello di pop alla MyGroupViewController. Ma non sto capendo questa linea di codice.

MyGroupViewController *groupViewController = (MyGroupViewController*)viewController; 

Che cosa sta succedendo esattamente qui. Non penso che una nuova istanza di MyGroupViewController venga creata qui.

risposta

21
//This for loop iterates through all the view controllers in navigation stack. 
for (UIViewController* viewController in self.navigationController.viewControllers) { 

    //This if condition checks whether the viewController's class is MyGroupViewController 
    // if true that means its the MyGroupViewController (which has been pushed at some point) 
    if ([viewController isKindOfClass:[MyGroupViewController class]]) { 

     // Here viewController is a reference of UIViewController base class of MyGroupViewController 
     // but viewController holds MyGroupViewController object so we can type cast it here 
     MyGroupViewController *groupViewController = (MyGroupViewController*)viewController; 
     [self.navigationController popToViewController:groupViewController animated:YES]; 
    } 
} 

Inoltre è possibile fare come questo

if ([viewController isKindOfClass:[MyGroupViewController class]]) { 
      [self.navigationController popToViewController:viewController animated:YES]; 
} 

codice Swift

//Itrate through all the view controllers in navigation stack 
for vc in self.navigationController!.viewControllers { 
    // Check if the view controller is of MyGroupViewController type 
    if let myGropupVC = vc as? MyGroupViewController { 
    self.navigationController?.popToViewController(myGropupVC, animated: true) 
    } 
} 
+0

"Qui viewController è un riferimento della classe base UIViewController di MyGroupViewController ma viewController mantiene l'oggetto MyGroupViewController in modo che possiamo digitare cast qui". Questo era esattamente quello che stavo cercando. Quindi viene utilizzata la stessa istanza di MyGroupViewController, che si trova già nello stack di navigazione. Destra? –

+0

Sì, è la stessa istanza che è stata inserita prima .. –

2

I controller di visualizzazione di uno stack del controller di navigazione vengono enumerati. Poiché questi controller di vista possono essere di qualsiasi tipo (ma erediteranno sempre da UIViewController), viene utilizzato il generico UIViewController. Tuttavia, il compilatore non saprà di che tipo è quel controller di visualizzazione, quindi viene castato su MyGroupViewController. Quando ciò accade, il compilatore sa qual è il tipo di classe e puoi inviarlo messaggi che si applicano solo a quella classe.

In questo caso è una specie di inutile, in quanto potrebbe essere semplificata a questo:

(UIViewController* viewController in self.navigationController.viewControllers) { 
    if ([viewController isKindOfClass:[MyGroupViewController class]]) { 
     [self.navigationController popToViewController:viewController animated:YES]; 
    } 
} 

Risposta breve: cambia un tipo di variabile per il tipo specificato tra parentesi per evitare avvisi del compilatore.

+0

Non ho l'istanza viewcontroller nella mia classe corrente. –

+0

@jean Paul Scott Hai già creato un'istanza di UIViewController nell'enumerazione veloce o puoi dire foreach loop –

+0

'MyGroupViewController * groupViewController = (MyGroupViewController *) viewController;' Mi piacerebbe sapere cosa succede in questo codice. Questo groupViewController è la stessa istanza che si trova nello stack di navigazione? –

1
for (int m=0; m<[self.navigationController.viewControllers count]; m++) 
{ 

     if([[self.navigationController.viewControllers objectAtIndex:m] isKindOfClass:[MyGroupViewController class]]) 
      { 

       MyGroupViewController * groupViewController = [self.navigationController.viewControllers objectAtIndex:m]; 
       [self.navigationController popToViewController:groupViewController animated:YES]; 
      } 
} 
+1

Non penso che tu stia rispondendo alla mia domanda. –

+2

tale riga fornirà riferimento al controller di visualizzazione richiesto –

0
- (void) RetunToSpecificViewController{ 

    for (UIViewController *controller in self.navigationController.viewControllers) { 
     if ([controller isKindOfClass:[AnOldViewController class]]) { 
     //Do not forget to import AnOldViewController.h 

      [self.navigationController popToViewController:controller 
               animated:YES]; 
      break; 
     } 
    } 

Su Swift

func RetunToSpecificViewController() 
{ 
    let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController] 
    self.navigationController!.popToViewController(viewControllers[viewControllers.count 
     - 5], animated: true) 
} 

Abbiamo scrivere una migliore tutorial su questo, è possibile controllare https://appengineer.in/2014/03/13/pop-to-specific-view-controller-in-ios/

Problemi correlati