ключ Эквивалент. для nsbutton не работает должным образом для нескольких nsbuttons

У меня есть две кнопки nsbutton в моем конструкторе интерфейсов. Для всех этих трех кнопок nsbutton я установил Key Equilant на клавишу «Возврат». А также я установил представление nextkey для всех этих кнопок.

У меня есть 3 разных действия для всех этих трех кнопок, и соединения сделаны правильно. Если я использую щелчок мышью, выполняются соответствующие действия.

После запуска приложения изначально моя первая кнопка имеет фокус, нажимает клавишу возврата, выполняется действие 1-й кнопки. Затем я нажал клавишу табуляции, сфокусированный изменился на 2-ю кнопку, нажал клавишу возврата, но действие 1-й кнопки выполнено. Я снова нажал клавишу табуляции. , фокус изменился на 3-ю кнопку, нажата клавиша возврата, все еще выполняется действие 1-й кнопки.

Чего мне здесь не хватает. Почему соответствующее действие не происходит при нажатии клавиши «Возврат» над nsbutton, даже если фокус выделен.


person Akbar    schedule 20.03.2012    source источник


Ответы (2)


Похоже, вы используете навигацию с помощью клавиатуры для переключения между кнопками и активации выбранной. В этом случае клавиша возврата обычно соответствует нажатию выбранной кнопки. Однако, поскольку вы назначили «Возврат» в качестве сочетания клавиш для одной или нескольких кнопок, цепочка ответчика ищет и находит кнопку с соответствующим эквивалентом ключа, поэтому вместо нее отправляется сообщение этой кнопки.

Попробуйте очистить эквивалент ключа для всех трех ваших кнопок. Я думаю, что это даст поведение, которое вы ищете.

Если вы не используете навигацию с помощью клавиатуры, непонятно, почему кнопка табуляции имеет какой-либо эффект. Тем не менее, если вы пытаетесь сделать что-то вроде циклического переключения кнопки по умолчанию с одной кнопки на другую, вам придется менять эквивалент клавиатуры при каждом нажатии кнопки. Я бы не рекомендовал это в целом — я не думаю, что пользователи хотели бы, чтобы кнопка по умолчанию менялась от одного момента к другому. Если вам нужно, вот код:

- (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 соответственно. Идея здесь заключается в том, что когда выбрана кнопка по умолчанию (т. е. та, у которой клавиша возврата является ее эквивалентом), она устанавливает клавишу следующей кнопки, эквивалентную «Возврату», и устанавливает свой собственный эквивалент равным нулю.

Очевидно, вы можете изменить способ работы кода — например, вы можете захотеть, чтобы каждая кнопка вызывала другое действие. В этом случае просто сделайте так, чтобы каждое действие вызывало общий метод, который выполняет ту же работу, что и приведенный выше код.

Урок здесь заключается в том, что если вы установите один и тот же эквивалент клавиши для нескольких кнопок, первая найденная будет «нажата». Если вы хотите изменить эквивалент клавиши, вам нужно изменить эквивалентный набор для различных кнопок.

person Caleb    schedule 26.03.2012
comment
Согласно вашей рекомендации, после очистки ключевых эквивалентов для моих кнопок действия для кнопки не вызываются. - person Akbar; 26.03.2012
comment
Похоже, вы используете навигацию с помощью клавиатуры для переключения между кнопками и активации выбранной, да, это мое требование. В этом случае клавиша возврата обычно соответствует нажатию выбранной кнопки, по умолчанию у меня этого не происходит. Нужно ли для этого что-то устанавливать в Nib Files? - person Akbar; 26.03.2012
comment
@Akbar Я говорю о функции доступа к клавиатуре в первой части своего ответа. Это то, что вы используете? Было бы полезно, если бы вы могли уточнить свой вопрос. - person Caleb; 26.03.2012
comment
, Спасибо за ваш ответ. Это должно предоставить ярлык клавиатуры (клавиша возврата) для нескольких NSButtons. Вместо взаимодействия с мышью над NSButtons я хочу, чтобы IBAction выполнялся с помощью клавиши возврата (одна клавиша) для нескольких кнопок. - person Akbar; 26.03.2012

Я не уверен, что вы имеете в виду под изменением фокуса при нажатии клавиши табуляции - я не вижу такого поведения (я настроил первоначальный ответчик и следующие ключевые соединения). Все три кнопки синие, но пульсирует только первая, какие бы клавиши я не нажимал. Немного поэкспериментировав, я обнаружил, что кнопка, которая находится вверху списка (в списке объектов окна), — это та кнопка, действие которой выполняется при нажатии возврата.

Я не могу найти никакой документации по этому поводу, но я не думаю, что вы можете установить один и тот же эквивалент ключа для нескольких кнопок в одном окне.

person rdelmar    schedule 26.03.2012