1

我正在尝试将触摸栏支持与 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

谢谢你。

4

1 回答 1

1

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

  1. 如果您可以为您的窗口提供自定义类,请-makeTouchBarNSWindow. 使用这种方法,您不需要设置或覆盖touchBar属性;-makeTouchBar将被延迟调用✝</sup> 以根据需要填充该属性。

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

✝</sup> 这种惰性很有用,因为如果设备没有 Touch Bar 或正在运行的模拟器,您可以避免做额外的工作。

如果您确实想将其实现为插入响应者链中的自定义响应者,则可以执行以下操作:

touchBarResponder.nextResponder = window.nextResponder;
window.nextResponder = touchBarResponder;
于 2016-11-19T04:06:47.463 回答