Почему эквивалент ключа работает с escape, а не с return? - PullRequest
0 голосов
/ 23 сентября 2011

У меня в окне есть кнопка, для которой в конструкторе интерфейсов задан эквивалент ключа ввода, но после переключения представления содержимого с использования IKImageBrowserView на NSCollectionView ключ keyEquivalent игнорируется.

Из того, что написано в документах: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html#//apple_ref/doc/uid/10000060i-CH3-SW10

События keyEquivalent обрабатываются как «специальные» и должны быть довольно простыми.

Я делю на подклассы NSCollectionViewItem и представление элемента, но ни один из этих подклассов не получает executeKeyEquivalent: theEvent, когда я переопределяю этот метод.

Рядом с кнопкой по умолчанию есть кнопка отмены, которая сопоставлена ​​с кнопкой esacpe. Отмена продолжает работать, но кнопка по умолчанию не работает.

Как я могу узнать, где обрабатывается событие ввода?

Edit:

На самом деле я обнаружил ту же проблему в примере приложения, которую использовал для изучения NSCollectionView. Я добавил кнопку по умолчанию в нижней части окна и обнаружил, что return не вызывает кнопку, а ввод (fn + return) вызывает кнопку.

Образец приложения IconCollection от Apple

Есть какие-нибудь идеи по поводу кражи события возврата в этом примере?

Edit:

Я разместил пример проекта здесь: https://github.com/watkyn/NSCollectionViewIssue. Почему не работает кнопка по умолчанию?

1 Ответ

3 голосов
/ 23 сентября 2011

Return и Enter - это две разные клавиши.Return (на клавиатуре США) справа от клавиши апострофа.Enter - нижняя правая клавиша на клавиатуре.Если вы используете ноутбук без цифровой клавиатуры, вы получите Enter, нажав fn + Return.


Изменить после публикации образца кода

MyCollectionView поглощает нажатие клавиши возврата / ввода и не передает его по цепочке респондента.Добавьте это к реализации MyCollectionView и нажмите Enter и Enter, нажав кнопку:

- (void)keyDown:(NSEvent *)theEvent {
//  NSLog(@"event: %@", theEvent);
    if (36 == theEvent.keyCode || 76 == theEvent.keyCode) {
        //pass return and enter up the responder chain
        [[self window] keyDown:theEvent];
    }
    else {
        //process all other keys in the default manner
        [super keyDown:theEvent];
    }
}

Это может вызвать проблемы, если вам нужно, чтобы MyControllerView действительно что-то делал сам с return / enter.В этом случае вы можете добавить [super keyDown:theEvent] до [[self window] keyDown:theEvent].

...