我在NSPanel
子類中重寫了- (void)keyDown:(NSEvent *)event
。keyDown:當焦點位於文本字段時,不會調用(NSEvent *)事件
但是,只有當我的面板中的焦點不在NSTextField
上時纔會調用它。 但是我需要趕上事件「按下輸入按鈕」無論焦點在文本字段還是面板上。
如何確保始終調用它?
我在NSPanel
子類中重寫了- (void)keyDown:(NSEvent *)event
。keyDown:當焦點位於文本字段時,不會調用(NSEvent *)事件
但是,只有當我的面板中的焦點不在NSTextField
上時纔會調用它。 但是我需要趕上事件「按下輸入按鈕」無論焦點在文本字段還是面板上。
如何確保始終調用它?
你確定需要捕捉關鍵事件嗎?
蘋果在文檔中指出,爲控件擺弄keyDown:
是最後的手段,只有在代表圍繞代表的正常Cocoa架構沒有做到您想要的時候才能使用。
如果目的是捕獲按下的輸入按鈕,請注意在文本字段中的此事件會觸發textDidEndEditing
委託方法(或者,如果您願意的話)。
因此,如果您在代表NSTextField
的代表中執行controlTextDidEndEditing:
,則應該能夠對事件做出反應。這個通知(和相關的委託方法)在字段編輯器結束編輯時發送。
如果您希望早一步捕捉事件(在字段編輯器結束編輯之前),您可以實現代理方法control:textView:doCommandBySelector:
,該方法可以攔截特定的關鍵事件(如返回鍵)並修改編輯。
一個例子可能是以下幾點:
- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector
{
BOOL retval = NO;
if (commandSelector == @selector(insertNewline:)) {
retval = YES; // Handled
// Do stuff that needs to be done when newLine is pressed
}
return retval;
}
有蘋果的關於它的網站大量的文檔資料,例如介紹here。