如何区分iOS8中的顶级窗口?

问题描述:

继从this SO answer策略,在iOS的7我能找到的顶层窗口在我的应用程序,像这样:如何区分iOS8中的顶级窗口?

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]不幸的是不可靠。)

我假设你只是想从你创建的窗口呈现。所以你可以:

  • 写一个UIWindow的子类,并在创建你的窗口时使用它。然后你可以测试该子类的窗口。
  • 将一个associated object添加到所有有资格呈现模态视图的窗口。然后,您可以在搜索窗口时测试关联的对象。
+0

谢谢您的建议。不幸的是,我不能控制创建的窗口。在调试时,一个团队可以添加一个NRWindow,屏幕截图团队可以添加另一个带有漂亮覆盖的窗口。 – Drakes