0

を含むビューを制御するTextViewControllerサブクラスである がありますNSViewControllerNSTextView

TextViewController次のコードを使用して、既存のビューにのインスタンスをアタッチします

TextViewController *textViewer;

...

[[self view] addSubview:[textViewer view]]; // embed new TextView in our host view
[[textViewer view] setFrame:[[self view] bounds]];  // resize the controller's view to the host size
textViewer.delegate = self;
[split.window makeFirstResponder:textViewer];

これは非常にうまく機能し、イベントをTextViewControllerトラップしてさまざまなアクションを実行します。keyDown

NSTextViewユーザーがテキストを選択してクリップボードにコピーできるようにしたかったのです。残念ながら、 をクリックすると にNSTextViewなり、FirstResponderキーTextViewControllerを押しても反応しなくなります。

FirstResponder を強制的に TextViewController に戻すことはできますが、これは面倒なようです。

- (void)textViewDidChangeSelection:(NSNotification *)aNotification {
    [self.view.window makeFirstResponder:self];
}

keyDown イベントをトラップするためにサブクラス化できることはわかってNSTextViewいますが、これはあまり良くないようです。

これを行うためのよりエレガントな方法があるに違いないと確信しています。

keyDown をコントローラーに渡すだけの NSTextView のサブクラスを追加しました

@protocol MyTextViewDelegate
- (BOOL)keyPressedInTextView:(NSEvent *)theEvent;
@end

@interface MyTextView : NSTextView
@property (assign) IBOutlet NSObject <MyTextViewDelegate> *delegate;
@end

...

@implementation MyTextView
@synthesize delegate;
- (void)keyDown:(NSEvent *)theEvent {
    if([self.delegate respondsToSelector:@selector(keyPressedInTextView:)]) {
        if([self.delegate keyPressedInTextView:theEvent])
            return;
        }
    [super keyDown:theEvent];
}
@end
4

1 に答える 1

0

サブクラスNSTextView化は、あなたが説明した問題の最良の解決策のように思えます。定義した特別なキーの押下にも応答することを除いて、通常のように選択、コピー、Cmd-A などのように動作するテキスト ビューが必要です。これは、サブクラスの標準的な使用法です。ファーストレスポンダでゲームをプレイしてView Controllerに物事を処理させようとすると、発見したようなさまざまなエッジケースで問題が発生します。

于 2012-07-05T19:33:48.023 に答える