NSAlert:将第二个按钮设置为默认按钮和“取消”按钮

托马斯·坦佩尔曼

苹果最初的HIG(遗憾的是现在从网站上消失了)说:

对话框中最右边的按钮,即操作按钮,是用于确认警报消息文本的按钮。动作按钮通常(但并非总是)是默认按钮

就我而言,我有一些破坏性操作(例如擦除磁盘),需要“安全”确认对话框,如下所示:

“安全”确认对话框

最糟糕的选择是创建一个对话框,其中最右边的按钮将变为“请勿擦除”按钮,而其左边的一个按钮(通常为“取消”按钮)将变为“擦除”按钮,因为那样会导致容易遭受灾难(一次由Microsoft制造的对话框在我身上发生),因为人们受过训练,只要他们想取消操作就可以单击第二个按钮。

因此,我需要的是,左(取消)按钮既成为默认按钮,又对Return,Esc和cmd-period键做出反应。

为了使其默认并响应Return键,我只需要将第一个按钮设置为keyEquivalent空字符串,第二个按钮设置为“ \ r”。

但是当Esc或cmd-时,如何使警报取消。打字?

佐伊·彼得森(ZoëPeterson)

分配默认按钮,以通常的方式设置NSAlert。创建一个带有空边界的NSView新子类,并将其添加为NSAlert的附件视图。在子类中performKeyEquivalent,检查Esc以及它是否匹配call[-NSApplication stopModalWithCode:][-NSWindow endSheet:returnCode:]

#import "AppDelegate.h"

@interface AlertEscHandler : NSView
@end

@implementation AlertEscHandler
-(BOOL)performKeyEquivalent:(NSEvent *)event {
    NSString *typed = event.charactersIgnoringModifiers;
    NSEventModifierFlags mods = (event.modifierFlags & NSEventModifierFlagDeviceIndependentFlagsMask);
    BOOL isCmdDown = (mods & NSEventModifierFlagCommand) != 0;
    if ((mods == 0 && event.keyCode == 53) || (isCmdDown && [typed isEqualToString:@"."])) { // ESC key or cmd-.
        [NSApp stopModalWithCode:1001]; // 1001 is the second button's response code
    }
    return [super performKeyEquivalent:event];
}
@end

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    [self alertTest];
    [NSApp terminate:0];
}

- (void)alertTest {
    NSAlert *alert = [NSAlert new];
    alert.messageText = @"alert msg";
    [alert addButtonWithTitle:@"OK"];
    NSButton *cancelButton = [alert addButtonWithTitle:@"Cancel"];
    alert.window.defaultButtonCell = cancelButton.cell;
    alert.accessoryView = [AlertEscHandler new];
    NSModalResponse choice = [alert runModal];
    NSLog (@"User chose button %d", (int)choice);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用第二个按钮更改按钮状态

选择后更改按钮的颜色,如果选择了第二个按钮,则取消选择所选按钮

当我在第二个活动上按“取消”按钮时,onActivityResult错误

点击第二个按钮,我希望第一个和第二个按钮被着色

选择JS中的第二个提交按钮

表单外的PHP的第二个提交按钮

如何制作第二个提交按钮?

在Swift 3中按下创建提醒按钮时设置第二个提醒

仅为第二个选项卡设置按钮标题

如何为表格布局中的第二个按钮设置背景?

带操作按钮的过滤表和带串扰的第二个表

GridLayout 面板与第二个面板上的按钮和 JRadioButton 问题

按下HOME按钮后,将打开第二个活动

单击按钮将第二个UIViewController加载到容器中

在添加和删除第二个按钮时,在SwiftUI中保持导航项按钮对齐

RecyclerView 在第二个按钮而不是第一个按钮上更新

jQuery:单击第一个按钮后启用第二个按钮

当第一个按钮和第二个按钮之间存在另一个元素时,如何使用nth-child正确选择第二个按钮?

只能点击第二个按钮,如果第一按钮被点击

单击时无法禁用第二个按钮或任何其他按钮

如何在一个场景上将GameObject设置为活动状态,而在第二个场景上通过按钮单击功能加载了C#,Unity

隐藏第一个按钮点击显示第二个,隐藏第二个点击显示第一个按钮

如何在自定义UITableViewCell按钮和第二个视图之间创建序列

如何使用 Selenium 和 python 在浏览器的第二个窗口上单击 A 按钮

我可以将Windows默认的第二个显示器行为设置为“扩展这些显示”吗?

如何触发第二个按钮以打开另一个模式

如何通过单击第一个按钮刷新第二个窗口

如何使第二个活动中的按钮打开第三个活动?

Puppeteer 两个表单点击第二个提交按钮