我的界面构建器中有两个ns按钮。对于所有这三个ns按钮,我将Key Equilant设置为“Return”键。我还将nextkey视图设置为所有这些按钮。
对于所有这三个按钮,我有3个不同的操作,连接正确。 如果我使用鼠标单击相应的操作正在执行。
运行应用程序后,最初我的第一个按钮有焦点,按下返回键,第一个按钮的动作被执行。接下来我按Tab键,焦点变为第二个按钮,按下返回键但是第一个按钮的动作被执行。再次我按下Tab键,聚焦已更改为第3个按钮,按下返回键仍然执行第1个按钮的操作。
我在这里缺少什么。为什么在按下按键返回按钮而没有发生适当的动作,甚至突出显示焦点。
答案 0 :(得分:2)
当您按Tab键时,我不确定您对焦点更改的意思 - 我不会看到这种行为(我已经设置了初始第一响应者和下一个关键连接)。所有三个按钮都是蓝色的,但只有第一个按钮发出脉动,无论我按哪个按键。经过一番实验后,我发现位于列表顶部的按钮(在窗口的对象列表中)是在点击返回时执行操作的按钮。
我无法找到相关的任何文档,但我不认为您可以在同一窗口中为多个按钮设置相同的等效键。
答案 1 :(得分:2)
听起来您正在使用键盘导航在按钮之间切换并激活所选按钮。在这种情况下,返回键通常对应于按下所选按钮。但是,由于您已将Return指定为一个或多个按钮的快捷方式,因此响应程序链会搜索并找到具有匹配键等效键的按钮,以便发送按钮的消息。
尝试清除所有三个按钮的等效键。我认为这会给你正在寻找的行为。
如果您没有使用键盘导航,则不清楚选项卡按钮有何效果。不过,如果您尝试执行某些操作,例如将默认按钮循环从一个按钮循环到下一个按钮,则每次按下按钮时都需要更改等效键盘。我不会一般地推荐 - 我不认为用户希望默认按钮从一个时刻改变到下一个时刻。如果你必须,这里有一些代码:
- (IBAction)nextButton:(NSButton*)sender
{
int tag = [sender tag];
NSView *superview = [sender superview];
if ([sender.keyEquivalent isEqualToString:@"\r"]) {
NSButton *nextButton = [superview viewWithTag:(tag % 3) + 1];
nextButton.keyEquivalent = @"\r";
sender.keyEquivalent = @"";
}
}
这假设您有三个按钮,每个按钮都配置了nextButton:
方法作为其操作。此外,按钮分别具有标签1,2和3。这里的想法是,当选择默认按钮(即返回键作为其等效键的按钮)时,它设置下一个按钮的键等同于Return并将其自己的等效设置为空。
显然,您可以更改代码的工作方式 - 例如,您可能希望每个按钮调用不同的操作。在这种情况下,只需让每个动作调用一个与上面的代码完成相同工作的常用方法。
这里的教训是,如果为几个按钮设置相同的等效键,则第一个要按下的键将被“按下”。如果您希望更改等效键,则需要更改各种按钮的等效设置。