Obtains the Controller currently displayed in the window.
This solution is similar to the requirement that the Netease news client should pop up a UIAlert after receiving the News Push and jump to the news details page.
1. Provides a classification method for UIView. This method obtains the controller of the view through the responder chain.
- (UIViewController *)parentController{ UIResponder *responder = [self nextResponder]; while (responder) { if ([responder isKindOfClass:[UIViewController class]]) { return (UIViewController *)responder; } responder = [responder nextResponder]; } return nil;}
2. The controller instance object can be obtained through the Layout View of the controller.
Modal display mode requires the Controller's Root View
+ (UIViewController *) currentViewController {UIWindow * keyWindow = [UIApplication sharedApplication]. keyWindow; // The underlying view of the modal display mode is different // when the first layer is obtained, the UITransitionView is obtained, and the Controller UIView * firstView = [keyWindow. subviews firstObject]; UIView * secondView = [firstView. subviews firstObject]; UIViewController * vc = secondView. parentController; if ([vc isKindOfClass: [UITabBarController class]) {UITabBarController * tab = (UITabBarController *) vc; if ([tab. selectedViewController isKindOfClass: [UINavigationController class]) {UINavigationController * nav = (UINavigationController *) tab. selectedViewController; return [nav. viewControllers lastObject];} else {return tab. selectedViewController;} else if ([vc isKindOfClass: [UINavigationController class]) {UINavigationController * nav = (UINavigationController *) vc; return [nav. viewControllers lastObject];} else {return vc;} return nil ;}