关键等于对于多个ns按钮,nsbutton无法正常工作

时间:2012-03-20 06:28:05

标签: objective-c macos interface-builder nsbutton

我的界面构建器中有两个ns按钮。对于所有这三个ns按钮,我将Key Equilant设置为“Return”键。我还将nextkey视图设置为所有这些按钮。

对于所有这三个按钮,我有3个不同的操作,连接正确。 如果我使用鼠标单击相应的操作正在执行。

运行应用程序后,最初我的第一个按钮有焦点,按下返回键,第一个按钮的动作被执行。接下来我按Tab键,焦点变为第二个按钮,按下返回键但是第一个按钮的动作被执行。再次我按下Tab键,聚焦已更改为第3个按钮,按下返回键仍然执行第1个按钮的操作。

我在这里缺少什么。为什么在按下按键返回按钮而没有发生适当的动作,甚至突出显示焦点。

2 个答案:

答案 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并将其自己的等效设置为空。

显然,您可以更改代码的工作方式 - 例如,您可能希望每个按钮调用不同的操作。在这种情况下,只需让每个动作调用一个与上面的代码完成相同工作的常用方法。

这里的教训是,如果为几个按钮设置相同的等效键,则第一个要按下的键将被“按下”。如果您希望更改等效键,则需要更改各种按钮的等效设置。