继从战略这个苏答案 ,在iOS的7我能找到的顶层窗口在我的应用程序,如下所示:
UIWindow *topWindow = [[[UIApplication sharedApplication].windows sortedArrayUsingComparator:^NSComparisonResult(UIWindow *win1, UIWindow *win2) {
return win1.windowLevel - win2.windowLevel;
}] lastObject];
然而,由于iOS8上可以存在一个或多个UITextEffectsWindow
其可以是在S lastObject
在上述策略。 不好。
最初我可以运行窗口的阵列上的过滤器谓语和测试哪个窗口是UIWindow
就像这样:
NSPredicate *filter = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary *bind) {
return [obj isMemberOfClass:[UIWindow class]];
}];
然而,上面UIWindow
可能不是 UIWindow
,但一些子类像NRWindow 。 下面是一个例子:
[[NRWindow class] isKindOfClass:[UIWindow class]]; // true
[[UITextEffectsWindow class] isKindOfClass:[UIWindow class]]; // true
我的问题是这样的:我怎样才能安全地区分/找到顶部UIWindow
子类,所以我可以做的事情一样
[[topWindow rootViewController] presentViewController:mailComposer animated:YES completion:nil];
(注:测试UITextEffectsWindow
后直接被皱起了眉头,和[[UIApplication sharedApplication] keyWindow]
遗憾的是不可靠的。)