2016-11-18 59 views
1

我正在嘗試將觸摸板支持與SDL應用程序集成。如何從NSWindow對象創建NSTouchBar?

我已經進入了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

添加自定義應答器進入鏈是如何做這件事,但有兩個簡單的方法,你可能首先要考慮:

  1. 如果你能爲你的窗口提供的自定義類,實現-makeTouchBarNSWindow的子類中。通過這種方法,您不需要設置或覆蓋touchBar屬性; -makeTouchBar將被懶惰地調用根據需要填充該屬性。

  2. 如果您不能使用自己的窗口子類,則可以創建一個NSTouchBar對象並將其分配給該窗口的現有touchBar屬性。 (基本實現是一個存儲的屬性,所以沒有必要將其覆蓋。)

這懶惰是非常有用的,因爲你能避免做額外的工作,如果設備不具有觸摸條或運行模擬器。

如果你確實想實現這個作爲插入在響應鏈定製的響應,你可以做這樣的事情:

touchBarResponder.nextResponder = window.nextResponder; 
window.nextResponder = touchBarResponder; 
+0

感謝。我無法控制窗口或視圖類。 https://github.com/spurious/SDL-mirror/blob/master/src/video/cocoa/SDL_cocoawindow.m#L56我得到的只是NSWindow對象的句柄。 – xaxxon