我想用每个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事件它不起作用。这里我的错误是什么?
答案 0 :(得分:1)
啊,看着你的代码,我现在意识到问题所在。
您的“CodrTextView
”对象不是“NSTextView
”的子类(并且,当您以编程方式或通过XIB或Storyboard实例化对象时,请确保文本视图对象是自定义类“CodrTextView
”并且不只是另一个“NSTextView
”),因此它实际上并未调用“acceptsFirstResponder
”或“canBecomeKeyView
”方法。
您需要从“CodrTextView
”而不是“NSTextView
”下降“NSView
”, OR 您需要创建另一个子类“{{1 “将接收”NSTextView
“事件的对象,然后它将调用计算进入主视图”keyDown:
“的字符串的代码。
这对你有意义吗?