これと同じ問題を解決するためにこれを試してみましょう。オンラインで何かを見つけたことはありませんでしたが、これまでにうまくいくと思われるものを考え出しました。私がやっていることは次のとおりです:
NSTextView(または使用しているもの)をサブクラス化し、インスタンス変数を作成してキーダウンイベントを一時的に保存します。 。 。
@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
はこれです:イベントダウンキーはテキスト入力のために使用されていない場合には応答チェーンの上に "noop"コマンドが送信されます。デフォルトでは、レスポンスチェーンから逸脱したときにビープ音が鳴ります。私の解決策では、NSTextViewサブクラスはnoopコマンドをキャッチし、代わりに元のkeyDownイベントをレスポンスチェーンに投げます。 NSWindowまたは他のビューは、通常どおり、未使用のkeyDownイベントを取得します。
私の[ソリューション]を試してみてください(http://stackoverflow.com/a/23897022/1067147) – WINSergey