如何区分顶层的窗口,iOS8上?(How to differentiate top windows

2019-10-23 19:52发布

继从战略这个苏答案 ,在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]遗憾的是不可靠的。)

Answer 1:

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

  • 写一个UIWindow的子类,使用创建窗口时。 然后,你可以测试该子类的窗口。
  • 在添加关联对象 ,以有资格呈现模式的看法所有窗口。 然后,你可以为一个窗口搜索时测试关联的对象。


文章来源: How to differentiate top windows in iOS8?