3

故事:

当应用程序进入后台时,我需要以编程方式关闭 UIActionSheet,而我在 iOS 7 中所做的是遍历[UIApplication sharedApplication].windows并找到类型为 的视图UIActionSheet,然后将其关闭。它在 iOS 8 中不起作用。

背景:

在 iOS 8 中,UIAlertController应该用于呈现警报或操作表,并且一个小实验表明它UIActionSheet在内部使用以下实现UIAlertController

po [[UIApplication sharedApplication] keyWindow] <_UIAlertControllerShimPresenterWindow:

po [[[UIApplication sharedApplication] keyWindow] rootViewController] <_UIAlertShimPresentingViewController: 0x7faa0cf049f0>

po [[[[UIApplication sharedApplication] keyWindow] rootViewController] presentedViewController] <UIAlertController: 0x7faa0c8cb9e0>

哪个具有正确的标题、消息等。

混乱:

然后我添加了一些代码来解除控制器,它确实解除了它。但是,应用程序现在不响应任何用户交互,我发现关闭后keyWindow仍然是_UIAlertControllerShimPresenterWindow,然后我很困惑,不应该关闭呈现的控制器清理它的窗口吗?或者,是因为它只是在应用程序进入后台时被关闭,所以窗口层次结构不处于正常状态,因此事情搞砸了?

有人可以提供一些意见吗?

谢谢!

4

1 回答 1

1

起初我被这件事难住了。从视图控制器中,我在解除我称之为的 actionSheet 后呈现,假设它可以解决这个问题:

[self.view.window makeKeyAndVisible];

完全没用。shimPresenterWindow 仍然是主窗口。

所以我想出了一个不同的想法。关闭 alertController 后,立即插入以下代码:

NSString *windowDescription = NSStringFromClass([window class]);
        if ([windowDescription isEqualToString:@"_UIAlertControllerShimPresenterWindow"]){
            window.hidden = YES;
        }

结合使主窗口可见,成功地将操作表从主视图中移除。请注意,我不确定这是否会导致任何形式的内存泄漏。

于 2015-01-12T15:24:12.697 回答