NSButton рисуется внутри пользовательского NSCell, но на самом деле не кликабелен - PullRequest
1 голос
/ 28 февраля 2012

У меня есть NSTableView, который содержит мой пользовательский подкласс NSCell, IconCell.

IconCell содержит три элемента: изображение, текст и кнопку.

Вот упрощенная версия моего кода для рисования (closeButton - кнопка):

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
    NSPoint cellPoint = cellFrame.origin;

    [controlView lockFocus];

    CGFloat buttonWidth = [closeButton frame].size.width;

    [someNSImage drawInRect:NSMakeRect(cellPoint.x, cellPoint.y, ICON_WIDTH, ICON_HEIGHT) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0 respectFlipped:YES hints:nil];
    [someNSString drawInRect:NSMakeRect(cellPoint.x+ICON_WIDTH+PADDING, cellPoint.y, cellFrame.size.width - ICON_WIDTH - buttonWidth, cellFrame.size.height) withAttributes:someTextAttributes];
    [(NSButtonCell*)[closeButton cell] drawWithFrame:NSMakeRect(cellPoint.x + cellFrame.size.width - buttonWidth, cellPoint.y, buttonWidth, cellFrame.size.height) inView:controlView];

    [controlView unlockFocus];
}

Чертеж работает нормально и производит что-то вроде следующего:

cell screenshot

что я и хочу.

Более того, я хочу, чтобы одна из двух вещей происходила при взаимодействии пользователя с ячейкой: если пользователь щелкает в любом месте ячейки, ЗА ИСКЛЮЧЕНИЕМ кнопки закрытия, она должна выполнять actionA. Если пользователь нажимает на кнопку закрытия, он должен сделать actionB.

Проблема, с которой я столкнулся, заключается в том, что кнопка закрытия кажется «невидимой» - если я нажимаю на нее, она не перемещается (тогда как рабочая кнопка должна показывать свое нажатое состояние), и в целом она ведет себя как если его там не было, и вместо actionB запускается actionA.

Вот как я устанавливаю два действия:

[tableView setAction:@selector(actionA)];

и

[closeButton setAction:@selector(actionB)];

Что я делаю не так?

1 Ответ

1 голос
/ 28 февраля 2012

Вы просто рисуете изображение кнопки в ячейке. Это не то же самое, что поместить настоящую кнопку в ячейку.

Ячейки не являются полными представлениями, так что это сложнее, чем вы думаете на первый взгляд. Если вам действительно нужно сделать это с ячейками, это объясняется здесь: NSButtonCell внутри пользовательской NSCell .

Но ... если вы можете ограничиться 10.7+, они добавили табличные просмотры на основе представления. Это гораздо проще, так как вы можете поместить полный NSButton внутрь вашего NSTableViewCellView. Это объясняется в Руководство по программированию табличного представления . Настоятельно рекомендуется, если вы можете ограничить себя до 10,7 +.

...