如何从NSWindow对象创建NSTouchBar?

时间:2016-11-18 21:41:30

标签: objective-c cocoa sdl nstouchbar

我正在尝试将触摸栏支持与SDL应用程序集成。

我已经进入了SDL中的目标c代码并直接入侵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 个答案:

答案 0 :(得分:1)

将自定义响应器添加到链中是一种方法,但您可能需要首先考虑两种更简单的方法:

  1. 如果您可以为窗口提供自定义类,请在-makeTouchBar的子类中实现NSWindow。使用此方法,您无需设置或覆盖touchBar属性; -makeTouchBar将被懒惰地调用,以根据需要填充该属性。

  2. 如果您不能使用自己的窗口子类,则只需创建一个NSTouchBar对象并将其分配给窗口的现有touchBar属性。 (基本实现是一个存储属性,因此不需要覆盖它。)

  3. 这种懒惰很有用,因为如果设备没有Touch Bar或运行模拟器,你可以避免做额外的工作。

    如果你真的想将它作为插入响应者链的自定义响应者来实现,你可以这样做:

    touchBarResponder.nextResponder = window.nextResponder;
    window.nextResponder = touchBarResponder;