自定义字段编辑器不绘图

时间:2012-09-19 08:36:17

标签: objective-c macos cocoa nstokenfield

我正在尝试将NSTokenField子类化以拦截某些键盘事件。我为NSTokenField,NSTokenFieldCell和NSTextView编写了子类。在NSTokenField子类中,我将常规单元格与我的自定义单元格交换,并在自定义单元格中覆盖 - (NSTextView *)fieldEditorForView:(NSView *)aControlView以将我的textview作为自定义字段编辑器提供。所有初始化方法都按预期调用,但由于某种原因,我的自定义标记字段未被绘制。

以下是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];
}

加成

进一步挖掘后,我发现this post表示使用自定义文本视图NSTokenField的唯一方法是重写私有方法。这是真的吗?如果是这样,有没有其他方法可以拦截键盘事件而无需子类化NSTextView

0 个答案:

没有答案