导航栈中跳转到特定的视图控制器

6
我遇到了一段代码,可以弹出导航栈中特定的视图控制器,如下所示:
for (UIViewController* viewController in self.navigationController.viewControllers) {
    if ([viewController isKindOfClass:[MyGroupViewController class]] ) {
        MyGroupViewController *groupViewController = (MyGroupViewController*)viewController;
        [self.navigationController popToViewController:groupViewController animated:YES];
    }
}

目的是跳转到MyGroupViewController。但我不理解这行代码。

MyGroupViewController *groupViewController = (MyGroupViewController*)viewController;

这里到底发生了什么?我不认为这里正在创建一个新的MyGroupViewController实例。
4个回答

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

也可以这样做

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

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

这里的viewController是UIViewController基类MyGroupViewController的引用, 但viewController持有MyGroupViewController对象,因此我们可以在这里进行类型转换。这正是我一直在寻找的。 所以已经在导航栈中的MyGroupViewController实例被重复使用了,对吗? - Jean Paul

2
导航控制器堆栈的视图控制器正在被枚举。由于这些视图控制器可以是任何类型(但始终会继承自UIViewController),因此使用通用的UIViewController。但是,编译器将不知道该视图控制器的类型,因此它被强制转换为MyGroupViewController。发生这种情况时,编译器知道类的类型,您可以向其发送仅适用于该类的消息。
在这种情况下,这有点不必要,可以简化为以下内容:
(UIViewController* viewController in self.navigationController.viewControllers) {
    if ([viewController isKindOfClass:[MyGroupViewController class]] ) {
        [self.navigationController popToViewController:viewController animated:YES];
    }
}

简短回答:它将变量类型更改为括号中指定的类型,以避免编译器警告。

我在当前类中没有视图控制器实例。 - Jean Paul
@jean Paul Scott,你已经在快速枚举或者说foreach循环中创建了一个UIViewController实例。 - Anil Kothari
我想了解这段代码的含义:MyGroupViewController *groupViewController = (MyGroupViewController*)viewController; 这个groupViewController是不是和导航栈中的实例相同? - Jean Paul

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
我认为你没有回答我的问题。 - Jean Paul
2
那行代码将会引用所需的视图控制器。 - ganesh manoj

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

关于Swift

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

我们已经写了一篇更好的教程,您可以查看https://appengineer.in/2014/03/13/pop-to-specific-view-controller-in-ios/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接