首页 > 解决方案 > 无法在 Mac Catalyst 中以编程方式关闭警报?

问题描述

我正在显示这样的警报:

self.connectingAlert = [UIAlertController
    alertControllerWithTitle:@""
    message:NSLocalizedString(@"CONNECTING", nil)
    preferredStyle:UIAlertControllerStyleAlert];
[self.connectingAlert addAction:[UIAlertAction
    actionWithTitle:NSLocalizedString(@"BUTTON_CANCEL", nil)
    style:UIAlertActionStyleCancel
    handler:^(UIAlertAction *action) {
        [self cancelRequest];
    }]];
[self presentViewController:self.connectingAlert animated:TRUE completion:nil];

然后稍后我想像这样以编程方式关闭警报:

[self dismissViewControllerAnimated:FALSE completion:nil];

关闭代码在 iOS 中运行良好,但在 Mac Catalyst 中没有任何作用。这可能与警报显示为应用程序窗口的一部分(在应用程序之外)以及显示样式被忽略的事实有关。但我希望驳回方法仍会影响 Mac 警报。

我试过这个以确保一切都正确连接:

UIViewController *test1 = self.connectingAlert.presentingViewController;
UIViewController *test2 = self.connectingAlert.presentingViewController.presentedViewController;

test1返回视图控制器所属的导航控制器,这看起来很奇怪,但它在 iOS 上做同样的事情。test2返回我的警报。只是为了确保,我尝试了这段代码,但它也不起作用:

[self.connectingAlert.presentingViewController dismissViewControllerAnimated:FALSE completion:nil];

这个事情谁有经验?我在文档中没有看到任何关于它的内容

标签: iosuialertcontrollermac-catalyst

解决方案


事实证明,虽然您应该将关闭消息发送到呈现(父)视图控制器......

[self dismissViewControllerAnimated:FALSE completion:nil];

...我必须改为将解除消息发送到警报,然后解除:

[self.connectingAlert dismissViewControllerAnimated:FALSE completion:nil];

文档dismissViewControllerAnimated说:

呈现视图控制器负责关闭它呈现的视图控制器。如果您在呈现的视图控制器本身上调用此方法,UIKit 会要求呈现的视图控制器处理解除。

我认为这意味着 Mac Catalyst 在呈现和呈现的视图控制器之间的连接上做了一些有趣的事情。如果我检查self.presentedViewController,那给了我UIAlertController。但是如果我打电话self dismiss dismissViewControllerAnimated...,什么都不会发生,就好像没有呈现视图控制器一样。但是,如果我调用self.connectingAlert dismissViewControllerAnimated...,dismiss 方法会以某种方式找到真正呈现视图控制器的方式。我会将此作为错误报告给 Apple。

同时,我很高兴有一个解决方法。


推荐阅读