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

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

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

Когда я навожу курсор на
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:)];
}