Как добавить 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 событие.

Другие вопросы по тегам