場(chǎng)景
- 為了解耦,誰(shuí)的事情誰(shuí)去做,那么在View的類(lèi)中要push等等
- 其他需要使用控制器的場(chǎng)景
1. 獲取當(dāng)前View的ViewController
+ (UIViewController *)viewControllerFromView:(UIView *)view {
for (UIView *next = [view superview]; next; next = next.superview) {
UIResponder *nextResponder = [next nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]]) {
return (UIViewController *)nextResponder;
}
}
return nil;
}
2. 獲取當(dāng)前View的導(dǎo)航控制器
+ (UINavigationController *)navigationControllerFromView:(UIView *)view {
for (UIView *next = [view superview]; next; next = next.superview) {
UIResponder *nextResponder = [next nextResponder];
if ([nextResponder isKindOfClass:[UINavigationController class]]) {
return (UINavigationController *)nextResponder;
}
}
return nil;
}
獲取當(dāng)前屏幕顯示的ViewController
場(chǎng)景
- 接收到推送時(shí),觸發(fā)事件,從當(dāng)前屏幕顯示的ViewController跳轉(zhuǎn)
- ...
+ (UIViewController *)getCurrentVC {
UIWindow *window = [[UIApplication sharedApplication].windows firstObject];
if (!window) {
return nil;
}
UIView *tempView;
for (UIView *subview in window.subviews) {
if ([[subview.classForCoder description] isEqualToString:@"UILayoutContainerView"]) {
tempView = subview;
break;
}
}
if (!tempView) {
tempView = [window.subviews lastObject];
}
id nextResponder = [tempView nextResponder];
while (![nextResponder isKindOfClass:[UIViewController class]] || [nextResponder isKindOfClass:[UINavigationController class]] || [nextResponder isKindOfClass:[UITabBarController class]]) {
tempView = [tempView.subviews firstObject];
if (!tempView) {
return nil;
}
nextResponder = [tempView nextResponder];
}
return (UIViewController *)nextResponder;
}
注:有時(shí)候你可能需要如下的方式獲取
UIViewController *currentVC = [[self class] getCurrentVC].childViewControllers[0].childViewControllers[0];