popup到导航堆栈中的特定视图控制器
我碰到一段代码,popup到导航堆栈中的特定视图控制器,如下所示
for (UIViewController* viewController in self.navigationController.viewControllers) { if ([viewController isKindOfClass:[MyGroupViewController class]] ) { MyGroupViewController *groupViewController = (MyGroupViewController*)viewController; [self.navigationController popToViewController:groupViewController animated:YES]; } }
目标是popup到MyGroupViewController。 但我不理解这行代码。
MyGroupViewController *groupViewController = (MyGroupViewController*)viewController;
这里到底发生了什么。 我不认为在这里创build一个MyGroupViewController的新实例。
//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) } }
正在枚举导航控制器堆栈的视图控制器。 由于这些视图控制器可以是任何types的(但总是从UIViewControllerinheritance),通用的UIViewController被使用。 但是,编译器将不知道该视图控制器是什么types,所以它正在被铸造到一个MyGroupViewController。 当发生这种情况时,编译器知道什么类的类,你可以发送消息,只适用于该类。
在这种情况下,这是不必要的,因为它可以简化为:
(UIViewController* viewController in self.navigationController.viewControllers) { if ([viewController isKindOfClass:[MyGroupViewController class]] ) { [self.navigationController popToViewController:viewController animated:YES]; } }
简短的回答:它将variablestypes更改为括号中指定的types,以避免编译器警告。
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]; } }
- (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/