首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSTextView keyDown事件

NSTextView keyDown事件
EN

Stack Overflow用户
提问于 2013-03-21 19:11:19
回答 1查看 1.7K关注 0票数 2

我希望在每个按键操作时触发keyDown事件。因此,我创建了NSView的一个子类。

代码语言:javascript
复制
@interface CodrTextView : NSView {
    NSTextField *lineNumberSpace;
    NSTextView *mainTextView;
}

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

我已经有了这个方法的:

代码语言:javascript
复制
- (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对其进行了测试。方法如下:

代码语言:javascript
复制
- (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事件时,则不起作用。我在这里犯了什么错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-21 19:39:01

啊哈,看着你的代码,我现在意识到问题出在哪里。

您的"CodrTextView“对象不是"NSTextView”的子类(而且,当您以编程方式或通过XIB或Storyboard实例化该对象时,请确保文本视图对象是"CodrTextView“的自定义类,而不仅仅是另一个”NSTextView“类),因此它实际上也不会获得"acceptsFirstResponder”或"canBecomeKeyView“方法调用。

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

这对你来说有意义吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15545857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档