gpt4 book ai didi

macos - NSAlert:使第二个按钮既是默认按钮又是取消按钮

转载 作者:行者123 更新时间:2023-12-03 17:09:06 24 4
gpt4 key购买 nike

Apple 最初的 HIG(遗憾的是,现已从网站上消失)指出:

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

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

"Safe" confirmation dialog

最糟糕的选择是创建一个对话框,其中最右边的按钮将成为“不删除”按钮,而左边的按钮(通常是“取消”按钮)将成为“删除”按钮,因为这很容易导致灾难(happened to me 一次使用 Microsoft 制作的对话框),因为人们被训练在想要取消操作时单击第二个按钮。

所以,我需要的是左(取消)按钮成为默认按钮,并且还对 Return、Esc 和 cmd-period 键使用react。

要使其成为默认值并对 Return 键使用react,我只需将第一个按钮的 keyEquivalent 设置为空字符串,将第二个按钮设置为“\r”。

但是如何在 Esc 或 cmd- 时取消警报。是打字的吗?

最佳答案

按照通常的方式设置 NSAlert,并分配默认按钮。创建一个带有空边界的 NSView 的新子类,并将其添加为 NSAlert 的附属 View 。在子类的 performKeyEquivalent 中,检查 Esc 以及它是否匹配调用 [-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);
}

关于macos - NSAlert:使第二个按钮既是默认按钮又是取消按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53353246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com