इस समस्या को हल करने के लिए इस प्रयास में आया। कभी भी ऑनलाइन कुछ नहीं मिला, लेकिन मैं ऐसा कुछ लेकर आया जो अब तक अच्छी तरह से काम करता है। यहां मैं यह कर रहा हूं:
अपने एनएसटीएक्स्टव्यू (या जो कुछ भी आप उपयोग कर रहे हैं) को उपclass और अस्थायी रूप से कुंजी डाउन इवेंट को स्टोर करने के लिए एक आवृत्ति चर बनाएँ। । ।
@interface MyTextView : NSTextView {
NSEvent* _keyDownEvent;
}
@end
फिर तो जैसे अपने दृश्य के तरीकों को परिभाषित (बाहर ले आप स्वत: संदर्भ गिनती उपयोग कर रहे हैं बनाए रखने/रिलीज कबाड़):
@implementation MyTextView
- (id)initWithFrame:(NSRect)frame {
if (self = [super initWithFrame:frame]) {
_keyDownEvent = nil;
}
return self;
}
- (void)keyDown:(NSEvent*)event {
[_keyDownEvent release];
_keyDownEvent = [event retain];
[super keyDown:event];
}
- (void)doCommandBySelector:(SEL)selector {
if (_keyDownEvent && selector == @selector(noop:)) {
if ([self nextResponder]) {
[[self nextResponder] keyDown:[_keyDownEvent autorelease]];
} else {
[_keyDownEvent release];
}
_keyDownEvent = nil;
} else {
[super doCommandBySelector:selector];
}
}
- (void)dealloc {
[_keyDownEvent release];
[super dealloc];
}
@end
यहाँ कैसे मैं इस पर पहुंचे है। जब एक कुंजी प्रेस को संभाला नहीं जाता है, तो आप एक बीपिंग टोन सुनते हैं। तो, मैं NSBeep() पर एक ब्रेकपाइंट सेट, और जब कार्यक्रम को तोड़ दिया, मैं GDB में एक स्टैक ट्रेस थूक से बाहर:
#0 0x00007fff96eb1c2d in NSBeep()
#1 0x00007fff96e6d739 in -[NSResponder doCommandBySelector:]()
#2 0x00007fff96e6d72b in -[NSResponder doCommandBySelector:]()
#3 0x00007fff96fda826 in -[NSWindow doCommandBySelector:]()
#4 0x00007fff96e6d72b in -[NSResponder doCommandBySelector:]()
#5 0x00007fff96e6d72b in -[NSResponder doCommandBySelector:]()
#6 0x00007fff96e6d72b in -[NSResponder doCommandBySelector:]()
#7 0x00007fff96e6d72b in -[NSResponder doCommandBySelector:]()
#8 0x00007fff96e6d72b in -[NSResponder doCommandBySelector:]()
#9 0x00007fff96e6d72b in -[NSResponder doCommandBySelector:]()
#10 0x00007fff96e6d72b in -[NSResponder doCommandBySelector:]()
#11 0x00007fff96f486ce in -[NSTextView doCommandBySelector:]()
#12 0x00007fff96da1c93 in -[NSKeyBindingManager(NSKeyBindingManager_MultiClients) interpretEventAsCommand:forClient:]()
#13 0x00007fff970f5382 in -[NSTextInputContext handleEvent:]()
#14 0x00007fff96fbfd2a in -[NSView interpretKeyEvents:]()
#15 0x00007fff96f38a25 in -[NSTextView keyDown:]()
#16 0x0000000100012889 in -[MyTextView keyDown:] (self=0x1004763a0, _cmd=0x7fff972b0234, event=0x100197320) at /path/MyTextView.m:24
#17 0x00007fff96a16b44 in -[NSWindow sendEvent:]()
#18 0x00007fff969af16d in -[NSApplication sendEvent:]()
#19 0x00007fff969451f2 in -[NSApplication run]()
#20 0x00007fff96bc3b88 in NSApplicationMain()
#21 0x00000001000015e2 in main (argc=3, argv=0x7fff5fbff8f0) at /path/main.m:12
क्या हो रहा है यह है: कुंजी दबाए घटना पाठ इनपुट के लिए इस्तेमाल नहीं किया जाता है तो , एक "नोप" कमांड प्रतिक्रिया श्रृंखला भेज दिया जाता है। डिफ़ॉल्ट रूप से यह प्रतिक्रिया श्रृंखला से गिरने पर एक बीप ट्रिगर करता है। मेरे समाधान में, NSTextView उपclass नोप कमांड को पकड़ता है और इसके बजाय प्रतिक्रिया कुंजी के नीचे मूल कुंजीडाउन ईवेंट फेंकता है। फिर आपके एनएसविंडो या अन्य विचारों को सामान्य के रूप में कोई अप्रयुक्त कुंजीडाउन घटनाएं मिलेंगी।
मेरी [समाधान] का प्रयास करें (http://stackoverflow.com/a/23897022/1067147) – WINSergey