iOS 10:UIAlertController 只显示一个动作

Posted

技术标签:

【中文标题】iOS 10:UIAlertController 只显示一个动作【英文标题】:iOS 10: UIAlertController only showing one action 【发布时间】:2016-11-03 19:41:20 【问题描述】:

我有一个 UIAlertController:

UIAlertController *actionSheet = [UIAlertController
                                          alertControllerWithTitle:@"Options"
                                          message:@""
                                          preferredStyle:UIAlertControllerStyleAlert];

        UIAlertAction *start = [UIAlertAction
                             actionWithTitle:@"Start"
                             style:UIAlertActionStyleDefault
                             handler:^(UIAlertAction * action)
                             

                                 [self DisplayAlert:@"" textval:@"You are about to start. Would you like to continue?"];
                                 [actionSheet dismissViewControllerAnimated:YES completion:nil];
                             ];
        UIAlertAction *idle = [UIAlertAction
                             actionWithTitle:@"Idle"
                             style:UIAlertActionStyleDefault
                             handler:^(UIAlertAction * action)
                             

                                 [self DisplayAlert:@"" textval:@"You are about to idle. Would you like to continue?"];
                                 [actionSheet dismissViewControllerAnimated:YES completion:nil];
                             ];
        UIAlertAction *stop = [UIAlertAction
                             actionWithTitle:@"Stop"
                             style:UIAlertActionStyleDefault
                             handler:^(UIAlertAction * action)
                             

                                 [self DisplayAlert:@"" textval:@"You are about to stop. Would you like to continue?"];
                                 [actionSheet dismissViewControllerAnimated:YES completion:nil];
                             ];
        UIAlertAction *enable = [UIAlertAction
                               actionWithTitle:@"Enable"
                               style:UIAlertActionStyleDefault
                               handler:^(UIAlertAction * action)
                               

                                   [self DisplayAlert:@"" textval:@"You are about to enable. Would you like to continue?"];
                                   [actionSheet dismissViewControllerAnimated:YES completion:nil];
                               ];

        UIAlertAction *disable = [UIAlertAction
                               actionWithTitle:@"Disable"
                               style:UIAlertActionStyleDefault
                               handler:^(UIAlertAction * action)
                               

                                   [self DisplayAlert:@"" textval:@"You are about to disable. Would you like to continue?"];
                                   [actionSheet dismissViewControllerAnimated:YES completion:nil];
                               ];

        UIAlertAction *clear = [UIAlertAction
                               actionWithTitle:@"Clear"
                               style:UIAlertActionStyleDefault
                               handler:^(UIAlertAction * action)
                               

                                   [self DisplayAlert:@"" textval:@"You are about to clear. Would you like to continue?"];
                                   [actionSheet dismissViewControllerAnimated:YES completion:nil];
                               ];
        UIAlertAction *cancel = [UIAlertAction
                             actionWithTitle:@"Cancel"
                             style:UIAlertActionStyleDestructive
                             handler:^(UIAlertAction * action)
                             
                                 [actionSheet dismissViewControllerAnimated:YES completion:nil];
                             ];


        [actionSheet addAction:start];
        [actionSheet addAction:idle];
        [actionSheet addAction:stop];
        [actionSheet addAction:enable];
        [actionSheet addAction:disable];
        [actionSheet addAction:clear];
        [actionSheet addAction:cancel];
        [actionSheet setModalPresentationStyle:UIModalPresentationPopover];
        [actionSheet.view setTintColor:[UIColor blackColor]];
        UIPopoverPresentationController *popPresenter = [actionSheet popoverPresentationController];
        popPresenter.barButtonItem = wellControlItem;
        [appDelegate.splitViewController presentViewController:actionSheet animated:YES completion:nil];

为什么在 iPad 上显示菜单时只显示这些操作之一?我在 10.1 版 iPad sim 卡和设备(两者均不适用)以及 10.1 版 iPhone 7 sim 卡和设备(适用于所有 iPhone)上对此进行了测试。

自从我在 ios 8 发布后修复它以来一直有效(添加了 setTintColor)。调试它显示添加了“7 个操作”,所以我不确定从这里去哪里获取 UIAlertControllerStyleActionSheet,这是所需的显示选项。 UIAlertControllerStyleAlert 显示所有 7 个,但我喜欢旧的 UIAlertControllerStyleActionSheet 外观。

【问题讨论】:

不相关但不要尝试从任何操作表的操作中消除操作表。当它点击一个按钮时它会自动关闭。 我有一个有点类似的问题,在模拟器上运行时只会显示我的***操作,但在设备上运行时会显示所有操作。我没有尝试更改色调颜色或 UIAlertController 的任何方面,并且显示模式是 ActionSheet。这是模拟器中的错误吗?他们都表现出同样的问题。 @RonB。我刚刚使用 UIAlertControllerStyleAlert 并称之为一天。我的新版本已经在商店里了,因为自从 iOS 8 以来 ActionSheet 弹出功能一直存在问题。为什么要打它。嘿,如果你认为这个问题是有效的,你介意投票吗?有人对一个合理的问题投了反对票,这有点烦人。当一个问题有反对票时,它就不会帮助另一个人快速浏览 【参考方案1】:

在 iOS 10 下,如果您尝试设置警报控制器视图的 tintColor,则显示带有“ActionSheet”样式的 UIAlertController 将无法正常工作。我在为 iOS 10 更新应用时遇到了这个问题。我向 Apple 提交了错误报告。

所以你的主要问题将通过不调用来解决:

[actionSheet.view setTintColor:[UIColor blackColor]];

在 iOS 10 下。

与此问题无关,您的代码错误地试图从各种警报操作中关闭警报控制器。不要这样做。警报将自动解除。您需要删除所有对以下内容的调用:

[actionSheet dismissViewControllerAnimated:YES completion:nil];

【讨论】:

请注意,只有在 UIAlertController 中有超过 5 个 UIAlertAction 时才会出现此错误。 5个或更少,一切都很好。 另外,仍然可以从 presentViewController 的 completionHandler 中设置 tintColor。从完成处理程序内部设置色调颜色可以正常工作(它不会遇到相同的 iOS 10 错误),尽管在更改之前可能会出现原始色调颜色显示的短暂闪烁。 这发生在我在 UIAlertController 中有 6 个操作时。很难找到原因,所以我只想为未来的搜索者写下“6个动作”。谢谢!

以上是关于iOS 10:UIAlertController 只显示一个动作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中处理多个 UIAlertController?

iOS8 的 UIAlertController 标题始终为零

iOS9 上的 UIAlertController ActionSheet 问题

UIAlertController - 在警报中显示空白标题

iOS核心笔记——UIAlertController

iOS UIAlertController