Cocoa: установка эквивалента ключа

Я хочу установить ключевой эквивалент элемента меню с помощью [menuitem setKeyEquivalent: (NSString *) s],  как я могу это сделать, если у меня есть несколько модификаторов?

Я попытался:

unichar shift = NSShiftKeyMask, cmd = NSCommandKeyMask;
NSMutableString *keyequiv = [[NSMutableString alloc] init];

[keyequiv appendString:[NSString stringWithCharacter:&shift, 1]];
[keyequiv appendString:[NSString stringWithCharacter:&cmd, 1]];
[keyequiv appendString:@"x"];
[menuItem setKeyEquivalent:keyequivalent];

но это не работает.

Ответы

Ответ 1

Маскировка ключа-модификатора такова: маски, а не символы. Вы не можете вставить их в эквивалентную строку ключа. Чтобы применить их, используйте setKeyEquivalentModifierMask:

[menuItem setKeyEquivalentModifierMask: NSShiftKeyMask | NSCommandKeyMask];
[menuItem setKeyEquivalent:@"x"];

Как и любая другая маска, используйте побитовый оператор OR | для формирования комбинаций. Подробнее см. "Настройка эквивалента ключа меню" .

Ответ 2

Метод setKeyEquivalent: используется для указания символа, который запускает команду, но не модификаторов. Он будет устанавливать модификаторы по умолчанию, исследуя передаваемый вами персонаж. Если вы передадите строчный символ, он будет использовать только command. Если вы передадите символ верхнего регистра, он будет использовать shift + command. Из-за этого вам просто нужно сделать это для shift + command + x:

[menuItem setKeyEquivalent:@"X"];

Если вы хотите использовать другие модификаторы, вы вызываете setKeyEquivalentModifierMask: с правильными константами, выбранными из NSShiftKeyMask, NSAlternateKeyMask (опция), NSCommandKeyMask и NSControlKeyMask.

Ответ 3

Пример для Swift 2.0:

let key = String(utf16CodeUnits: [unichar(NSBackspaceCharacter)], count: 1) as String
item.keyEquivalentModifierMask = Int(NSEventModifierFlags.CommandKeyMask.rawValue | NSEventModifierFlags.ControlKeyMask.rawValue)
item.keyEquivalent = key

Ответ 4

Пример для Swift 3.0:

item.keyEquivalent = "x"
item.keyEquivalentModifierMask = [NSAlternateKeyMask, NSCommandKeyMask]