【问题标题】:iOS 8 - UIAlertController button styling not being applied correctlyiOS 8 - UIAlertController 按钮样式未正确应用
【发布时间】:2015-03-24 03:27:57
【问题描述】:

我有一个 UIAlertController,我添加了 2 个 UIAlertAction 按钮——一个标记为“OK”,另一个标记为“Cancel”。我对它们都使用 UIAlertActionStyle.Default 样式。但是,取消按钮似乎应用了 .Cancel 样式(强字体粗细),这不是我想要的。我如何摆脱这种风格?

注意:我注意到,如果我更改 UIAlertAction 按钮添加到 UIAlertController 的顺序——首先添加“取消”按钮,然后添加“确定”按钮——然后“确定”按钮将获得强字体取而代之的是重量。

【问题讨论】:

    标签: ios ios8 dialog uialertview uialertcontroller


    【解决方案1】:

    简而言之,iOS 8 不允许您在警报上没有粗体文​​本按钮。

    iOS 将加粗它假定的默认选项。因为用户界面指南要求将最常用的选项放在右侧,并且添加的顺序按钮决定了它们在两个按钮警报上显示的顺序,所以添加的第二个选项是粗体。将 UIAlertActionStyle 设置为取消而不是默认设置不会产生明显的两个按钮效果。

    用户界面指南可以在here 找到。我引用的部分指出:

    适当放置按钮。理想情况下,最自然的按钮 to tap 应该满足两个标准: 它应该执行的操作 用户最有可能想要并且应该是最不可能 如果用户无意中点击它会导致问题。具体来说:

    当最有可能的按钮执行非破坏性操作时,它 应该在两个按钮警报的右侧。取消按钮 这个动作应该在左边。

    当最有可能的按钮执行破坏性操作时,它应该 在两个按钮警报中位于左侧。取消这个的按钮 动作应该在右边。

    【讨论】:

    • 目前我的警报上有两个按钮,一个是带有样式破坏的“删除”,另一个是带有样式取消的“取消”。我的理解和你的一样,破坏性的行为总是在左边。但是,无论我添加这两个按钮的顺序是什么,“删除”始终显示在右侧,样式为红色。取消始终显示在左侧,自动设置为蓝色和粗体。那到底是怎么回事!?
    【解决方案2】:

    这是一个很晚的答案,但我发布了这个,以防将来有人发现它很方便。

    似乎即使在 iOS 9.3 中,破坏性按钮也比取消按钮具有一些内部优先级。因此对于带有一个破坏性和一个取消按钮的UIAlertController,破坏性按钮始终显示在右侧。

    为了克服这个问题,我将取消按钮样式更改为 UIAlertActionStyleDefault,并将其 preferredAction 设置为按钮 1(默认按钮),使其看起来像原始的取消按钮。

    代码是这样的:

    UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Are you sure that you want to delete selected picture(s)?" preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"Yes" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
        //delete
        [alert dismissViewControllerAnimated:YES completion:NULL];
    }]];
    [alert addAction:[UIAlertAction actionWithTitle:@"No" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        [alert dismissViewControllerAnimated:YES completion:NULL];
    }]];
    alert.preferredAction = alert.actions[1];
    [self presentViewController:alert animated:YES completion:NULL];
    

    不知何故,正如预期的那样!

    PS:我猜代码是用 Objective C 编写的,但可以很容易地转换为 Swift。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多