ключевой эквивалент для кнопки nsbutton не работает должным образом для нескольких кнопок nsbutton - PullRequest
3 голосов
/ 20 марта 2012

У меня есть две nsbuttons в моем конструкторе интерфейса. Для всех этих трех nsbuttons я установил Key Equilant на клавишу «Return». И также я установил следующий вид для всех этих кнопок.

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

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

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

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

Похоже, вы используете навигацию с помощью клавиатуры для переключения между кнопками и активации выбранной. В этом случае клавиша возврата обычно соответствует нажатию выбранной кнопки. Однако, поскольку вы назначили 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, и устанавливает свой собственный эквивалент ничем.

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

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

2 голосов
/ 26 марта 2012

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

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

...