如何从 NSWindow 对象创建 NSTouchBar?
Posted
技术标签:
【中文标题】如何从 NSWindow 对象创建 NSTouchBar?【英文标题】:How to create an NSTouchBar from an NSWindow object? 【发布时间】:2016-11-18 21:41:29 【问题描述】:我正在尝试将触摸栏支持与 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】:将自定义响应器添加到链中是一种方法,但您可能需要首先考虑两种更简单的方法:
如果您可以为您的窗口提供自定义类,请在 NSWindow
的子类中实现 -makeTouchBar
。使用这种方法,您无需设置或覆盖touchBar
属性; -makeTouchBar
将被延迟调用✝ 以根据需要填充该属性。
如果您不能使用自己的窗口子类,您可以创建一个NSTouchBar
对象并将其分配给窗口现有的touchBar
属性。 (基本实现是一个存储属性,因此无需覆盖它。)
✝ 这种惰性很有用,因为如果设备没有 Touch Bar 或正在运行的模拟器,您可以避免做额外的工作。
如果您确实想将其实现为插入到响应者链中的自定义响应者,您可以执行以下操作:
touchBarResponder.nextResponder = window.nextResponder;
window.nextResponder = touchBarResponder;
【讨论】:
谢谢。我无法控制窗口或视图类。 github.com/spurious/SDL-mirror/blob/master/src/video/cocoa/… 我得到的只是 NSWindow 对象的句柄。以上是关于如何从 NSWindow 对象创建 NSTouchBar?的主要内容,如果未能解决你的问题,请参考以下文章
如何仅使用 SwiftUI 从@main App 访问 NSWindow?
如何在其 contentView 上使用 NSImageView 拖动移动 NSWindow?