2

すべてのキーアクションでkeyDownイベントをトリガーしたい。したがって、NSViewのサブクラスを作成しました。

@interface CodrTextView : NSView {
    NSTextField *lineNumberSpace;
    NSTextView *mainTextView;
}

- (id) initWithTextView:(NSTextView *)textView lineNumberSpace:(NSTextField *)textField;

私はすでにメソッドを持っています:

- (id) initWithTextView:(NSTextView *)textView lineNumberSpace:(NSTextField *)textField {
   self = [self init];
   if (self){
       mainTextView = textView;
       lineNumberSpace = textField;
   }
   return self;
}

- (BOOL) acceptsFirstResponder {
   return YES;
}

- (BOOL)canBecomeKeyView {
   return  YES;
}

私の計画は、textViewの行を数え、lineNumberSpaceに数値を書き込むことです。ボタンのIBActionですでにテストしているので、メソッドが機能することはわかっています。これは方法です:

- (long) getLineCount{
    NSString *content = [mainTextView string];
    NSUInteger numberOfLines, index, contentLength = [content length];
    for (index = 0, numberOfLines = 0; index < contentLength; numberOfLines++){
         index = NSMaxRange([content lineRangeForRange:NSMakeRange(index, 0)]);
    }

    NSLayoutManager *layoutManager = [mainTextView layoutManager];
    NSUInteger numberOfGlyphs =[layoutManager numberOfGlyphs];
    NSRange lineRange;
    for (numberOfLines = 0, index = 0; index < numberOfGlyphs; numberOfLines++){
         (void) [layoutManager lineFragmentRectForGlyphAtIndex:index
                                           effectiveRange:&lineRange];
          index = NSMaxRange(lineRange);
    }
    numberOfLines++;
    return numberOfLines;
}

- (void)keyDown:(NSEvent *)event {
     NSMutableString *lineNumberString = [NSMutableString string];
     long numberOfLines = [self getLineCount];

     for (int i = 1; i <= numberOfLines; i++){
         [lineNumberString appendString:([NSString stringWithFormat:@"%d \n", i])];
     }
     [lineNumberSpace setStringValue:lineNumberString];
}

この方法は確実に機能します。問題は、ボタンを使用するとlineNumberSpaceの数値が正しく変更されますが、keyDownイベントを使用すると機能しないことです。ここでの私の間違いは何ですか?

4

1 に答える 1

1

ああ、あなたのコードを見て、私は今、問題が何であるかを理解しています。

" CodrTextView"オブジェクトは""からサブクラス化されていませんNSTextView(また、プログラムで、またはXIBまたはストーリーボードを介してオブジェクトをインスタンス化する場合は、テキストビューオブジェクトが ""のカスタムクラスであり、CodrTextView単なる ""ではないことを確認してくださいNSTextView)。 「 acceptsFirstResponder」または「canBecomeKeyView」メソッド呼び出しも実際には取得されません。

「 」の代わりに「CodrTextView」から「」を降りる必要があります。または、「」イベント受け取る別のサブクラス化された「」オブジェクトを作成する必要があります。次に、「」に入る文字列を計算するコードを呼び出します。メインビュー。NSTextViewNSViewNSTextViewkeyDown:lineNumberSpace

これは今あなたにとって意味がありますか?

于 2013-03-21T11:39:01.453 に答える