У меня есть окно с 3 NSTableViews и 1 NSCollectionView. В представлении коллекции отображаются изображения. Я хочу иметь возможность выбрать одно из изображений и удалить его с помощью клавиши удаления на клавиатуре, но я не могу заставить представление коллекции стать первым ответчиком. Я могу выбрать любое из представлений таблиц и переопределить keyDown, чтобы принимать ввод с клавиатуры, но это не работает с представлением коллекции. Я сделал это в другом месте, используя makeFirstResponder(_:), чтобы сфокусироваться на представлении коллекции, но в этом приложении окно имело только одно представление. Любые мысли о том, что я делаю неправильно?
NSCollectionView не будет принимать ключевые события
Ответы (2)
Если вы можете выбирать изображения в представлении коллекции или перемещаться в представлении коллекции с помощью клавиш со стрелками на клавиатуре - обычно это означает, что представление коллекции является первым ответчиком.
Поэтому попробуйте включить выбор, проверьте, включен ли просмотр коллекции.
Также возможно, что ключ удаления является эквивалентом ключа подробнее здесь. Если это так, вы должны переопределить метод performKeyEquivalent(with: ) для получения событий этого типа.
Также метод NSCollectionView keyDown(with: ) не передает ключевые события вверх по цепочке респондентов. Чтобы обрабатывать такие события в суперпредставлении, вы должны переопределить его в представлении коллекции, вызвав self.nextResponder?.keyDown(with: event) для таких событий, которые вы хотите обрабатывать самостоятельно.
Чтобы расширить действительный ответ Константина...
Раздражает то, что NSCollectionView не передает немодифицированные ключевые события вверх по цепочке респондентов — даже если он сам не обрабатывает их напрямую — как клавиша Delete.
если вам нужно, чтобы клавиша «Удалить» работала в качестве эквивалента клавиши для пункта меню «Файл/Удалить», вы просто настраиваете ее в построителе интерфейса, нажав «Backspace» в значении «Эквивалент ключа» для элемента, и создайте суперкласс для NSCollectionView и переопределить keyDown - как это в Swift 4...
override func keyDown(with event: NSEvent) {
if let ascii = event.characters?.first?.unicodeScalars.first?.value, ascii == NSBackspaceCharacter || ascii == NSDeleteCharacter {
nextResponder?.keyDown(with: event)
} else {
super.keyDown(with: event)
}
}
Таким образом, меню в конечном итоге получает событие и выполняет «эквивалент ключа». Так что вы можете справиться с этим, например. в контроллере представления:
@IBAction func delete(_ sender: AnyObject) {
// ... do whatever
}