Question

I've an NSAlert with an accessory view and three buttons, the buttons aren't aligned to right (for LTR system) but seems to expand to the width of accessory view as shown below NSAlert and accessory view

Also removing the accessory view the three buttons aren't correctly aligned on right

How can fix this problem? I don't want to replace the NSAlert writing the code myself, why I must reinvent the wheel?

The code I use is copied by setAccessoryView documentation and reported below

NSTextView *accessory = [[NSTextView alloc] initWithFrame:NSMakeRect(0,0,600,15)];
NSFont *font = [NSFont systemFontOfSize:[NSFont systemFontSize]];
NSDictionary *textAttributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
[accessory insertText:[[NSAttributedString alloc] initWithString:@"Text in accessory view"
                                                      attributes:textAttributes]];
[accessory setEditable:NO];
[accessory setDrawsBackground:NO];

NSAlert *alert = [[NSAlert alloc] init];

[alert setMessageText:@"Message text"];
[alert setInformativeText:@"Informative text"];
[alert setAccessoryView:accessory];

[alert addButtonWithTitle:@"Btn 3"];
[alert addButtonWithTitle:@"Btn 2"];
[alert addButtonWithTitle:@"Btn 1"];

[alert runModal];
[alert release];
Was it helpful?

Solution

That’s the current default layout of an alert. An alert with three buttons is treated differently because its common use case is:

  • The first button (e.g. OK) represents a confirmation
  • The second button (e.g. Cancel) represents a cancellation
  • The third button (e.g. Kill the Penguin) represents an alternative action, potentially a destructive one.

The third button is positioned to the left to make it clear that it represents an action distinct from go ahead (first button) and stop (second button).

This can be seen in some Apple applications. In Pages:

enter image description here

In TextEdit:

enter image description here

Also, NSAlert’s documentation states that:

The standard alert layout is subject to change in future system software versions. Therefore, if you rely on custom alert layout, you should make sure your layouts work as expected in future releases of Mac OS.

So they might decide in the future to align all three buttons to the right, or only the first button to the right and the two remaining buttons to the left. That explains why NSAlert doesn’t provide public API to specify the position or alignment of its buttons.

If you really need a different layout, it looks like you’ll have to design it yourself.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top