3

有什么办法可以拿掉 NSAlert 按钮的对焦环。这就是我的意思:

聚焦环烦人地出现在 NSAlert 按钮上

这是我的代码:

[NSApp activateIgnoringOtherApps:YES];
NSAlert *alert = [[[NSAlert alloc] init] autorelease];
[alert addButtonWithTitle:@"Quit"];
[alert addButtonWithTitle:@"Cancel"];
[alert setMessageText:@"Warning!"];
[alert setInformativeText:@"How do you solve this question?"];
[alert setAlertStyle:NSWarningAlertStyle];
[alert beginSheetModalForWindow:nil modalDelegate:self didEndSelector:@selector(someMethodDidEnd:returnCode:contextInfo:) contextInfo:nil];
4

6 回答 6

3

也一直在尝试解决这个问题并想出了这个解决方法:

NSAlert *alert = [NSAlert alertWithMessageText:@"Alert" defaultButton:@"123" alternateButton:@"" otherButton:@"" informativeTextWithFormat:@""];
NSButton *button = [[alert buttons] objectAtIndex:0];

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [[button window] makeFirstResponder:nil];
});

[alert runModal];

前两行很简单——创建一个警报并获得一个按钮。然后问题是实际上将警报面板的第一响应者设置为 nil,但是,它可能只有警报已运行模式之后,所以这就是使用 dispatch_after 的原因。

但是,在您的情况下,由于您使用的是工作表而不是运行它,因此模态可以仅使用以下方法:

NSAlert *alert = [NSAlert alertWithMessageText:@"Alert" defaultButton:@"123" alternateButton:@"" otherButton:@"" informativeTextWithFormat:@""];
NSButton *button = [[alert buttons] objectAtIndex:0];

[alert beginSheetModalForWindow:window modalDelegate:nil didEndSelector:NULL contextInfo:NULL];
[[button window] makeFirstResponder:nil];
于 2013-12-06T10:03:20.910 回答
2

我会说你根本不应该这样做,这将违反苹果的指导方针。

于 2012-11-07T06:16:52.700 回答
1

老问题,但为了记录:

要将对焦环分配给特定按钮,请使用setAccessibilityFocused = true

alert.addButton(withTitle: "Save Changes").setAccessibilityFocused = true

完全避开对焦环

当心,setAccessibilityFocused(false)在这里不起作用。而是refusesFirstResponder = true为所有警报按钮设置:

alert.addButton(withTitle: "Save Changes").refusesFirstResponder = true
alert.addButton(withTitle: "Don't Save").refusesFirstResponder = true
于 2017-09-16T14:47:39.223 回答
0

更快的方法是:

for (NSButton* button in [alert buttons])
{
    [button setKeyEquivalent:@""];
}
NSInteger answer = [alert runModal];
于 2016-07-25T21:10:30.790 回答
0

我只是用下面的单线做到了这一点。我的警报有三个按钮,并希望中间按钮具有键盘焦点。左键默认为键盘焦点,右键为默认键。

[alert.buttons[1] setAccessibilityFocused:YES];

我还禁用了其他按钮上的对焦环,以确保没有外观问题。

于 2017-02-17T22:13:27.840 回答
0

对于那些希望从 NSAlert 中删除右侧 NSButton 的默认蓝色突出显示的人,请使用以下命令:

let alert: NSAlert = NSAlert()
alert.messageText = messageTitle
alert.informativeText = messageBody
alert.alertStyle = NSAlert.Style.informational
alert.addButton(withTitle: "Button 1").keyEquivalent = ""
alert.addButton(withTitle: "Button 2").keyEquivalent = ""

alert.beginSheetModal(for: self.view.window!, completionHandler: { (modalResponse: NSApplication.ModalResponse) -> Void in

    // handle response

})
于 2019-07-04T10:36:35.193 回答