如何区分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添加到所有有资格呈现模态视图的窗口。然后,您可以在搜索窗口时测试关联的对象。
谢谢您的建议。不幸的是,我不能控制创建的窗口。在调试时,一个团队可以添加一个NRWindow,屏幕截图团队可以添加另一个带有漂亮覆盖的窗口。 – Drakes