我正在尝试继承 NSTokenField 来拦截一些键盘事件。我为 NSTokenField、NSTokenFieldCell 和 NSTextView 编写了子类。在 NSTokenField 子类中,我将常规单元格与自定义单元格交换,并在自定义单元格中覆盖 -(NSTextView*)fieldEditorForView:(NSView *)aControlView 以提供我的文本视图作为自定义字段编辑器。所有初始化方法都按预期调用,但由于某种原因,我的自定义令牌字段未绘制。
这是 NSTokenField 子类的代码:
@synthesize fieldEditor = _fieldEditor;
-(JSTextView *)fieldEditor
{
if (!_fieldEditor) {
_fieldEditor = [[JSTextView alloc] init];
[_fieldEditor setFieldEditor:YES];
}
return _fieldEditor;
}
- (void)awakeFromNib {
JSTokenFieldCell *newCell = [[JSTokenFieldCell alloc] init];
[self setCell:newCell];
}
+ (Class) cellClass
{
return [JSTokenFieldCell class];
}
- (id)initWithFrame:(NSRect)frameRect
{
self = [super initWithFrame:frameRect];
if (self) {
JSTokenFieldCell *newCell = [[JSTokenFieldCell alloc] init];
[self setCell:newCell];
}
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
JSTokenFieldCell *newCell = [[JSTokenFieldCell alloc] initWithCoder:aDecoder];
[self setCell:newCell];
}
return self;
}
下面是 NSTokenFieldCell 子类的代码:
-(NSTextView*)fieldEditorForView:(NSView *)aControlView
{
if ([aControlView isKindOfClass:[JSTokenField class]]) {
JSTokenField *tokenField = (JSTokenField *)aControlView;
return tokenField.fieldEditor;
}
return nil;
}
- (id)initWithCoder:(NSCoder *)decoder
{
return [super initWithCoder:decoder];
}
- (id)initTextCell:(NSString *)aString
{
return [super initTextCell:aString];
}
- (id)initImageCell:(NSImage *)anImage
{
return [super initImageCell:anImage];
}
添加
在进一步挖掘之后,我发现这篇文章说拥有NSTokenField
自定义文本视图的唯一方法是覆盖私有方法。这是真的吗?如果是这样,有没有其他方法可以在没有子类化的情况下拦截键盘事件NSTextView
?