2

我想用每个 Key 动作触发 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 或 Storyboard 实例化对象时,请确保文本视图对象是“”的自定义类,CodrTextView而不仅仅是另一个“ NSTextView”),所以它是实际上也没有得到“ acceptsFirstResponder”或“ canBecomeKeyView”方法调用。

您需要CodrTextView从“ NSTextView”而不是“”下降“ NSView”,或者您需要创建另一个接收“ ”事件的子类“ NSTextView”对象,然后它将调用计算进入“ ”的字符串的代码主视图。keyDown:lineNumberSpace

这对你现在有意义吗?

于 2013-03-21T11:39:01.453 回答