2015-07-13 53 views
1

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

回答

0

我假設你只是想從你創建的窗口呈現。所以你可以:

  • 寫一個UIWindow的子類,並在創建你的窗口時使用它。然後你可以測試該子類的窗口。
  • 將一個associated object添加到所有有資格呈現模態視圖的窗口。然後,您可以在搜索窗口時測試關聯的對象。
+0

謝謝您的建議。不幸的是,我不能控制創建的窗口。在調試時,一個團隊可以添加一個NRWindow,屏幕截圖團隊可以添加另一個帶有漂亮覆蓋的窗口。 – Drakes