Как добавить NSViewController в цепочку респондента?
Мне трудно понять и найти информацию о том, как заставить NSViewController принимать события клавиш и мыши. Я где-то читал, что для регистрации этих событий в NSViewController его нужно добавить в цепочку респондента, но я не могу найти ответ, как правильно это сделать.
Любая помощь высоко ценится!
3 ответа
На CocoaWithLove.com есть хороший учебник.
Подведем итог: вы создадите подкласс NSView (например, "EugeneView"), а затем этот подкласс будет иметь несколько дополнительных методов, таких как " setNextResponder
" а также " setViewController
Msgstr "И выполнение этих двух методов должно включить ваш NSViewController в цепочку респондента.
Исправление вручную в NSViewController
в цепочке респондента больше не требуется, начиная с OS X 10.10 Yosemite. Согласно WWDC '14, "они автоматически подключаются в цепочке респондентов сразу после их просмотра".
Или, если, как и в большинстве случаев, представление вашего контроллера является просто общим контейнером, вставьте ваш контроллер в цепочку респондента между его представлением и его подпредставлениями. Это можно сделать с помощью этих строк кода в контроллере awakeFromNib:
Obj-C:
[self setNextResponder:self.view];
for (NSView *subview in self.view.subviews) {
[subview setNextResponder:self];
}
Swift:
override func awakeFromNib() {
super.awakeFromNib()
self.nextResponder = self.view
for subview in self.view.subviews {
subview.nextResponder = self
}
}
Нет необходимости в подклассе.
Пока отлаживаю. Я заметил NSViewControllerview
не принимает первый респондент.
Вы можете подтвердить это, распечатав print(viewController.view) //false
для добавления NSViewController в цепочку респондентов его представление должно acceptFirstReponder
. Это можно легко сделать, создав расширение NSView и переопределив егоacceptFirstResponder
extension NSView{
//making view acceptFirstResponder by default,
//this will enable NSViewController receive responder event dispatched into responder chain
open override var acceptsFirstResponder: Bool{return true}
}
При этом ваш контроллер будет добавлен в цепочку респондентов и будет получать все события ответчика.
Мое объяснение может быть не слишком точным, поскольку я новичок в Какао. но решение работает отлично.
Я сделал это, чтобы решить проблему, когда мой ViewController не получает onKeyDown
событие.