【发布时间】:2013-03-21 11:11:18
【问题描述】:
我想用每个 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 事件它不起作用。我的错误是什么?
【问题讨论】:
-
如果你在 "
keyDown:" 方法中设置断点,在 Xcode 中执行 "setStringValue:" 的行是否命中? -
这就是问题所在,我认为 keyDown 事件有问题。
-
试试这个:如果你在“
keyDown:”方法的开始设置断点(例如,创建可变字符串的代码行),那个当你按下按键的时候? -
不,它也不要破坏。
标签: events nstextfield keydown nstextview first-responder