Как создать NSTouchBar из объекта NSWindow?

Я пытаюсь интегрировать поддержку сенсорной панели с приложением SDL.

Я вошел в объективный код c в SDL, взломал код SDLView и получил работающую сенсорную панель, но теперь я хочу получить ту же функциональность со стандартной библиотекой SDL2. SDL предоставляет объект NSWindow, который он создает, и я думаю, что могу создать объект респондента с помощью makeTouchBar и makeItemForIdentifier, но я не знаю, как "прикрепить" его к окну. Я думаю, что это будет "цепочка респондентов", но я не знаю точно, что это значит или как это сделать.

Я попытался создать следующее и попробовал несколько разных комбинаций setNextResponder в окне, но, похоже, не могу найти правильную комбинацию для вызова makeTouchBar, но я на правильном пути, так как он работает, когда я помещаю эти методы прямо на виду.

@interface MyTouchbarResponder : NSResponder
- (id)init;

@property(strong, readonly) NSTouchBar *touchBar;
- (NSTouchBar *)makeTouchBar;
- (nullable NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier;


@end




@implementation MyTouchbarResponder
- (id)init
{
    [super init];
}

- (NSTouchBar *)makeTouchBar
{
 ...stuff...
}

- (nullable NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier
{
...stuff...
}

@end

Спасибо.

1 ответ

Добавление пользовательского ответчика в цепочку - это один из способов сделать это, но есть два простых способа, которые вы могли бы рассмотреть в первую очередь:

  1. Если вы можете предоставить собственный класс для своего окна, реализуйте -makeTouchBar в подклассе NSWindow, При таком подходе вам не нужно устанавливать или переопределять touchBar имущество; -makeTouchBar будет вызываться лениво, чтобы заполнить это свойство по мере необходимости.

  2. Если вы не можете использовать свой собственный подкласс окна, вы можете просто создать NSTouchBar объект и назначить его существующему окну touchBar имущество. (Базовая реализация является хранимым свойством, поэтому нет необходимости переопределять его.)

Эта лень полезна тем, что вы можете избежать дополнительной работы, если на устройстве нет сенсорной панели или запущенного симулятора.

Если вы действительно хотите реализовать это как собственный респондент, вставленный в цепочку респондента, вы можете сделать что-то вроде этого:

touchBarResponder.nextResponder = window.nextResponder;
window.nextResponder = touchBarResponder;
Другие вопросы по тегам