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
か?