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

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

Я вошел в код Objective 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

Спасибо.


person xaxxon    schedule 18.11.2016    source источник


Ответы (1)


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

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

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

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

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

touchBarResponder.nextResponder = window.nextResponder;
window.nextResponder = touchBarResponder;
person Jeff    schedule 19.11.2016
comment
Спасибо. У меня нет контроля над окнами или классами представлений. github.com/spurious/SDL- mirror/blob/master/src/video/cocoa/ Все, что я получаю, — это дескриптор объекта NSWindow. - person xaxxon; 19.11.2016