2012-06-14 3 views
5

Ich habe über ein Stück Code ein kommen zu einem bestimmten Viewcontroller in einem Navigationsstapel Pop wie untenzu einem bestimmten Viewcontroller in einem Navigationsstapel Popping

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

Ziel zu MyGroupViewController Pop ist. Aber ich verstehe diese Codezeile nicht.

MyGroupViewController *groupViewController = (MyGroupViewController*)viewController; 

Was genau passiert hier. Ich denke nicht, dass eine neue Instanz von MyGroupViewController hier erstellt wird.

Antwort

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

Sie können auch tun, wie diese

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

Swift Code

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

"Hier ist ViewController eine Referenz der UIViewController-Basisklasse von MyGroupViewController , aber ViewController enthält das MyGroupViewController-Objekt, so dass wir es hier eingeben können". Das war genau das, wonach ich suchte. Daher wird dieselbe Instanz von MyGroupViewController verwendet, die bereits im Navigationsstapel enthalten ist. Recht? –

+0

Ja, es ist die gleiche Instanz, die vorher gepusht wurde .. –

2

Die View-Controller eines Navigationscontroller-Stacks werden aufgelistet. Da diese View-Controller von beliebiger Art sein können (aber immer von UIViewController erben), wird der generische UIViewController verwendet. Der Compiler wird jedoch nicht wissen, welcher Typ dieser Ansichtscontroller ist, daher wird er an einen MyGroupViewController übergeben. Wenn dies geschieht, weiß der Compiler, welcher Typ der Klasse und Sie können Nachrichten senden, die nur für diese Klasse gelten.

In diesem Fall ist es ein bisschen unnötig, da es so weit vereinfacht werden könnte:

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

Kurze Antwort: es ändert sich ein Variablentyp auf den Typ in den Klammern angegebenen Compiler-Warnungen zu vermeiden.

+0

ich in meiner aktuellen Klasse haben die Viewcontroller Instanz nicht. –

+0

@jean Paul Scott Sie haben bereits eine Instanz von UIViewController in der schnellen Enumeration erstellt oder Sie können foreach loop sagen –

+0

'MyGroupViewController * groupViewController = (MyGroupViewController *) viewController;' Ich würde gerne wissen, was in diesem Code passiert. Ist diese groupViewController dieselbe Instanz, die sich im Navigationsstapel befindet? –

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

Ich denke nicht, dass Sie meine Frage beantworten. –

+2

Diese Zeile verweist auf den erforderlichen View-Controller –

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

Auf Swift

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

Wir haben ein besseres Tutorial über das schreiben, können Sie überprüfen https://appengineer.in/2014/03/13/pop-to-specific-view-controller-in-ios/

Verwandte Themen