iOS UIAlertController bold button changed in 8.3

IosButtonUialertcontroller

Ios Problem Overview


UIAlertController with two buttons with styles set:

UIAlertActionStyle.Cancel
UIAlertActionStyle.Default

in iOS 8.2, the Cancel button is non-bold and Default is bold. In iOS 8.3 they have switched round

You can see it Apple's own apps e.g., Settings > Mail > Add Account > iCloud > enter invalid data, then it shows like this on 8.3:

Unsupported Apple ID

Learn More (bold) OK (non-bold)

whereas it was the other way round for 8.2.

Any workaround to make it like 8.2 again. Why has it changed?

Ios Solutions


Solution 1 - Ios

From iOS 9 you can set the preferredAction value to the action which you want the button title to be bold.

    let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
    let OKAction = UIAlertAction(title: "OK", style: .Default, handler: nil)
    alert.addAction(cancelAction)
    alert.addAction(OKAction)
    alert.preferredAction = OKAction
    presentViewController(alert, animated: true) {}

The OK button which is on the right will be in bold font.

Solution 2 - Ios

This is an intentional change to the SDK. I have just had a response from Apple to this radar on the issue, stating that:

> This is an intentional change - the cancel button is to be bolded in alerts.

I can't find anything in the various change logs mentioning this, unfortunately.

So, we'll need to make changes to our apps in places to make some things make sense.

Solution 3 - Ios

Since iOS 9, UIAlertController has a property called preferredAction. preferredAction has the following declaration:

var preferredAction: UIAlertAction? { get set }

>The preferred action for the user to take from an alert. [...] The preferred action is relevant for the UIAlertController.Style.alert style only; it is not used by action sheets. When you specify a preferred action, the alert controller highlights the text of that action to give it emphasis. (If the alert also contains a cancel button, the preferred action receives the highlighting instead of the cancel button.) [...] The default value of this property is nil.


The Swift 5 / iOS 12 sample code below shows how to display a UIAlertController that will highlight the text of a specified UIAlertAction using preferredAction:

let alertController = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)

let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
let okAction = UIAlertAction(title: "OK", style: .default, handler: { action in
    print("Hello")
})

alertController.addAction(cancelAction)
alertController.addAction(okAction)
alertController.preferredAction = okAction

present(alertController, animated: true, completion: nil)

Solution 4 - Ios

I just checked in iOS 8.2: a first added button is non-bold and a second added button is bold. With this code a cancel button will be bold:

[alertController addAction:[UIAlertAction actionWithTitle:@"Ok"
                                                    style:UIAlertActionStyleDefault
                                                  handler:nil]];
[alertController addAction:[UIAlertAction actionWithTitle:@"Cancel"
                                                    style:UIAlertActionStyleCancel
                                                  handler:nil]];

And with this code a default button will be bold:

[alertController addAction:[UIAlertAction actionWithTitle:@"Cancel"
                                                    style:UIAlertActionStyleCancel
                                                  handler:nil]];
[alertController addAction:[UIAlertAction actionWithTitle:@"Ok"
                                                    style:UIAlertActionStyleDefault
                                                  handler:nil]];

I can't check in iOS 8.3 now but this behavior can be a reason.

Solution 5 - Ios

Some words about objective-c and preferredAction for alertActions. If you use preferredAction you BOUTH alertAction must set as style:UIAlertActionStyleDefault. If some one will be set as style:UIAlertActionStyleCancel, preferredAction will be ignored

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"All you base"
                                                                         message:@"Are belong to us!" preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction* alertActionShowYes = [UIAlertAction actionWithTitle:@"YES!" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
    NSLog(@"I serve for my emperor!");
}];

UIAlertAction* alertActionNo = [UIAlertAction actionWithTitle:@"NO!" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
    NSLog(@"NOOOO it's not true!!");
}];

[alertController addAction:alertActionShowYes];
[alertController addAction:alertActionNo];

alertController.preferredAction = alertActionShowYes;
[alertController setPreferredAction:alertActionShowYes];
    
[self presentViewController:alertController animated:YES completion:nil];

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBbxView Question on Stackoverflow
Solution 1 - IosThiView Answer on Stackoverflow
Solution 2 - IosJosh HealdView Answer on Stackoverflow
Solution 3 - IosImanou PetitView Answer on Stackoverflow
Solution 4 - IosVladView Answer on Stackoverflow
Solution 5 - IosОлег Александрович ПустошкинView Answer on Stackoverflow