关于获取当前viewController的实现 上网查了很多,但是不全。自己整合了一下
思路通过过responder 来一步一步的找到最上层的viewcontroller
UIViewController *result = nil;
UIWindow * window = [[UIApplication sharedApplication] keyWindow];
if (window.windowLevel != UIWindowLevelNormal)
{
NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow * tmpWin in windows)
{
if (tmpWin.windowLevel == UIWindowLevelNormal)
{
window = tmpWin;
break;
}
}
}
UIView *frontView = [[window subviews] objectAtIndex:0];
NSArray *array = [window subviews];
//找到最上层的View
id nextResponder = [frontView nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]])
result = nextResponder;
else
result = window.rootViewController;
return result;
首先进行第一步就死获取 当前window ,查了一下 keywindow 这个东西 保存rootviewController的window 默认的模式是normal, 还有二个是alter 和statusBar。
得到window后 就可以 顺藤摸瓜了
Window是展现视图的,就要从view找起,通过index为0的UIView向上找,直到“响应链”上的一个ViewController。
参考文章:http://www.molotang.com/articles/1513.html
但是这样做是有缺陷的
但view controller present的时候 这个方法就 失效了
所以我们需要加上一句
while (result.presentedViewController) {
NSLog(@"heheh");
result = result.presentedViewController;
}
顺藤摸瓜