Программно создайте NSButton и установите пользовательский NSButtonCell

Хорошо, это кажется очень простым, но я исхожу из iOS и, должно быть, упускаю что-то очень очевидное. Итак, у меня есть собственный подкласс NSButtonCell. Если я создаю NSButton в IB и назначаю NSButtonCell в IB, это работает без проблем.

Однако мне нужно программно создать эту кнопку. Я просмотрел пару примеров и обнаружил следующее в awakeFromNib, однако он создает то, что выглядит как обычная кнопка с моей пользовательской ячейкой кнопки внизу (я могу сказать, когда нажимаю кнопку).

NSButton* button = [[NSButton alloc] initWithFrame:NSMakeRect(100, 100, 60, 30)];
CT_CaptureButtonCell* captureCell = [[CT_CaptureButtonCell alloc] init];
[button setCell:captureCell];
[captureCell release];
[self.view addSubview:button];

Так что за глупость я упускаю/не понимаю? Спасибо.


person InfalibleCoinage    schedule 09.12.2012    source источник
comment
Я не понял, что вы пытаетесь сделать. Кнопка появляется регулярно, и когда вы нажимаете, вы можете увидеть ячейку кнопки. Что вы сделали, кроме того, чтобы увидеть вместо этого?   -  person Ramy Al Zuhouri    schedule 09.12.2012
comment
В целях тестирования ячейка пользовательской кнопки окрашена в красный цвет. Я вижу обычную кнопку, но когда я нажимаю, обычная кнопка немного смещается, и я вижу красную ячейку по краям. Я ожидаю увидеть красную кнопку все время (это то, что я вижу, когда подключаюсь к IB).   -  person InfalibleCoinage    schedule 09.12.2012


Ответы (1)


Если вы посмотрите на документация для "setCell:", в ней указано:

Обсуждение

Используйте этот метод с большой осторожностью, так как он может безвозвратно повредить поврежденный элемент управления; в частности, вы должны использовать этот метод только в инициализаторах для подклассов NSControl.

Насколько я понимаю, вы должны вызывать свой "setCell" из внутри метода инициализации для подкласса "NSButton". Другими словами, напишите свой собственный подкласс NSButton (например, «ICButton» для InfalibleCoinage), а затем вставьте вызов «setCell» в метод инициализации.

И пока мы обсуждаем эту тему, какова общая картина того, чего вы именно пытаетесь достичь с помощью «CT_CaptureButtonCell», и можете ли вы сделать это без использования пользовательской кнопки?

person Michael Dautermann    schedule 09.12.2012
comment
Хороший улов, спасибо. Я создаю подклассы NSButton и модифицирую их следующим образом. Тем не менее, это дает мне такое же поведение. Я попытался создать перо только с пользовательской кнопкой, и это работает, но кажется неудобным способом сделать это. (И я использую пользовательскую ячейку кнопки, чтобы иметь пользовательский рисунок/графику, зависящий от состояния) [code](- (id)initWithFrame:(NSRect)frame { self = [super initWithFrame:frame]; if (self) { // Код инициализации здесь.[self setCell:[[[CT_CaptureButtonCell alloc] init] autorelease]];} return self;}) Как форматировать код в комментарии??!!?? - person InfalibleCoinage; 09.12.2012