如何区分iOS8中的顶部窗口?
按照iOS 7的策略,我可以在我的应用程序中找到顶部窗口,如下所示:如何区分iOS8中的顶部窗口?,ios,objective-c,ios8,uiwindow,Ios,Objective C,Ios8,Uiwindow,按照iOS 7的策略,我可以在我的应用程序中找到顶部窗口,如下所示: UIWindow *topWindow = [[[UIApplication sharedApplication].windows sortedArrayUsingComparator:^NSComparisonResult(UIWindow *win1, UIWindow *win2) { return win1.windowLevel - win2.windowLevel; }] lastObject]; 但是,
UIWindow *topWindow = [[[UIApplication sharedApplication].windows sortedArrayUsingComparator:^NSComparisonResult(UIWindow *win1, UIWindow *win2) {
return win1.windowLevel - win2.windowLevel;
}] lastObject];
但是,由于iOS8,可能存在一个或多个uitextfectswindow
s,它们可能是上述策略中的lastObject
。不好
最初,我可以在窗口数组上运行谓词过滤器,并测试哪些窗口是UIWindow
s,如下所示:
NSPredicate *filter = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary *bind) {
return [obj isMemberOfClass:[UIWindow class]];
}];
但是,顶部的UIWindow
可能不是UIWindow
,而是一些类似的子类。以下是一个例子:
[[NRWindow class] isKindOfClass:[UIWindow class]]; // true
[[UITextEffectsWindow class] isKindOfClass:[UIWindow class]]; // true
我的问题是:如何安全地区分/找到顶部的ui窗口
子类,以便执行以下操作
[[topWindow rootViewController] presentViewController:mailComposer animated:YES completion:nil];
(注意:不赞成直接测试
uitextfectswindow
,不幸的是,[[UIApplication sharedApplication]keyWindow]
不可靠。)我假设您只想从您创建的窗口演示。所以你可以:
- 编写UIWindow的子类,并在创建窗口时使用它。然后可以测试该子类的窗口
- 向所有有资格显示模式视图的窗口添加。然后,您可以在搜索窗口时测试关联对象
- 编写UIWindow的子类,并在创建窗口时使用它。然后可以测试该子类的窗口
- 向所有有资格显示模式视图的窗口添加。然后,您可以在搜索窗口时测试关联对象