absterno
@absterno

Странное поведение NSTokenField. Как исправить?

У меня есть класс FormatField который я отнаследовал от NSTokenField. В классе FormatField есть кнопка для вызова NSMenu. Выгладит это так:
e5786d673cfa47d3b10604ba5eed36ca.png

Когда нажимают на плюсик (который является NSButton) то появляется NSMenu:
63322c02d1fa410cae3ab248ef8d231b.png

Вроде все работает нормально, но когда я вызываю NSMenu, нажатием на плюсик, и потом сразу кликаю мышкой в другом месте окна программы чтобы появившееся меню исчезло. Меню исчезает и вместе с ним исчезают токены и текст в поле FormatField:
98e62914bbe04f98bea103c267bfbac9.png

Когда я навожу курсор на FormatField его содержимое появляется, а когда отвожу курсор то содержимое исчезает - это поведение сохраняется пока я не кликну по полю FormatField.

Помогите пожалуйсто разобраться как исправить это странное поведение (не могли бы вы привести примеры кода). Всем заранее спасибо.

Для ясности:

Я создал класс FormatFieldCell который отнаследовал от NSTokenFieldCell для того чтобы переписать метод drawingRectForBounds: чтобы выделить место для кнопки в поле FormatField

@implementation FormatFieldCell

- (NSRect) drawingRectForBounds:(NSRect)rect {
    NSRect newRect = [super drawingRectForBounds:rect];

    CGFloat x = newRect.origin.x;  //отступ сбоку 2
    CGFloat y = newRect.origin.y;  //отступ сверху 3
    CGFloat width = newRect.size.width - 18;   //ширина поля ввода (ширина TokenField за вычетом отступов и прочего по усмотрению) 22
    CGFloat height = newRect.size.height;  //высота поля ввода (высота TokenField за вычетом отступов и прочего по усмотрению) 4

    NSLog(@"%s x: %f y: %f w: %f h: %f", __func__, x, y, width, height);

    return CGRectMake(x, y, width, height);
}

@end


И как писал ранее создал класс FormatField который я отнаследовал от NSTokenField чтобы добавить в него NSButton:

@implementation FormatField

- (instancetype)initWithCoder:(NSCoder *)coder {        
    if (self = [super initWithCoder:coder]) {
        _button = [[NSButton alloc] initWithFrame:NSMakeRect(([self frame].size.width - 20), 1, 18, 20)];
        [_button setTitle:@""];
        [_button setState:NSOffState];
        [_button setImage:[NSImage imageNamed:@"PMAddTemplate.tiff"]];
        [_button setBordered:NO];
        [_button setBezelStyle:NSBezelStyleShadowlessSquare];
        [self addSubview:_button];
    }

    return self;
}

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];

    [self drawCell:self.cell];

    NSLog(@"%s x: %f y: %f w: %f h: %f", __func__, dirtyRect.origin.x, dirtyRect.origin.y, dirtyRect.size.width, dirtyRect.size.height);

    [_button setFrameOrigin:NSMakePoint(([self frame].size.width - 20), 1)];
}

@end


Таргеты и действия я назначаю кнопке из класса где обрабатывается работа FormatField. (Это несколько разных классов):

- (void)awakeFromNib {
    tokens = [NSArray arrayWithObjects:[[Token alloc] initToken:@"number" withMenu:numberMenu], [[Token alloc] initToken:@"name" withMenu:nil], nil];

    [formatField setObjectValue:tokens];
    [[formatField button] setTag:69];
    [[formatField button] setTarget:self];
    [[formatField button] setAction:@selector(action:)];
}
  • Вопрос задан
  • 201 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы