【问题标题】:Dismiss UIActionSheet programatically in iOS 8 screws up UIApplication's windows/keyWindow在 iOS 8 中以编程方式关闭 UIActionSheet 搞砸了 UIApplication 的 windows/keyWindow
【发布时间】:2014-10-30 01:39:25
【问题描述】:

故事:

当应用程序进入后台时,我需要以编程方式关闭 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,然后我很困惑,不应该关闭一个呈现的控制器来清理它的窗口吗?或者,是因为它只是在应用程序进入后台时被关闭,所以窗口层次结构不处于正常状态,因此事情搞砸了?

谁能给点意见?

谢谢!

【问题讨论】:

  • 为什么不在 UIAlertController 上使用dismissViewController?
  • 谢谢@sha 我试过了,但是没用。
  • 如果这不起作用,就会发生其他奇怪的事情。

标签: ios objective-c uiactionsheet uialertcontroller


【解决方案1】:

起初我对此感到困惑。在关闭我称之为的 actionSheet 后,我​​正在呈现的视图控制器中,假设它可以解决这个问题:

[self.view.window makeKeyAndVisible];

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-01-18
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多