2012-06-14 13 views
5

mam natknąć kawałek kodu do pop do konkretnego viewcontroller w stosie nawigacji poniżejPopping do konkretnego viewcontroller w stos nawigacyjnym

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

Celem jest pop do MyGroupViewController. Ale nie rozumiem tej linii kodu.

MyGroupViewController *groupViewController = (MyGroupViewController*)viewController; 

Co dokładnie tutaj się dzieje. Nie sądzę, że tworzona jest tutaj nowa instancja MyGroupViewController.

Odpowiedz

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

Ponadto można zrobić jak ten

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

Kod 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

"Tutaj viewController jest odwołaniem do klasy bazowej UIViewController z MyGroupViewController , ale viewController przechowuje obiekt MyGroupViewController, abyśmy mogli wpisać go tutaj". Właśnie tego szukałem. Tak więc używane jest to samo wystąpienie MyGroupViewController, które jest już w stosie nawigacyjnym. Dobrze? –

+0

Tak, to ta sama instancja, która została wcześniej popchnięta ... –

2

Kontrolery widoku stosu kontrolera nawigacyjnego są wyliczane. Ponieważ te kontrolery widoku mogą być dowolnego rodzaju (ale zawsze będą dziedziczyć z UIViewController), używany jest ogólny UIViewController. Jednak kompilator nie będzie wiedział, jakiego typu jest ten kontroler widoku, więc jest przesyłany do MyGroupViewController. Gdy tak się stanie, kompilator wie, jaki typ klasy i możesz wysyłać wiadomości, które dotyczą tylko tej klasy.

W tym przypadku jest to rodzaj zbędne, ponieważ może to być uproszczone do tego:

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

Krótka odpowiedź: to zmienia typ zmiennej do określonego typu w nawiasie, aby uniknąć ostrzeżenia kompilatora.

+0

I dont mieć viewcontroller instancji w mojej obecnej klasie. –

+0

@jean Paul Scott Już utworzyłeś instancję UIViewController w szybkim wyliczeniu lub możesz powiedzieć pętlę foreach –

+0

'MyGroupViewController * groupViewController = (MyGroupViewController *) viewController;' Chciałbym wiedzieć, co dzieje się w tym kodzie. Czy to kontroler groupViewController jest tą samą instancją, która znajduje się w stosie nawigacyjnym? –

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

Nie sądzę, że odpowiadasz na moje pytanie. –

+2

linia ta poda referencje do wymaganego kontrolera widoku –

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

Na Swift

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

Mamy napisać lepszy tutorial, że można sprawdzić https://appengineer.in/2014/03/13/pop-to-specific-view-controller-in-ios/

Powiązane problemy