NSPopUpButton: NSPopUpButtonCell устарел?

В документации для NSPopUpButton указано:

Объект NSPopUpButton использует объект NSPopUpButtonCell для реализации своего пользовательского интерфейса.

Я получил новый класс от NSPopUpButtonCell, который реализует drawBorderAndBackgroundWithFrame:inView: для достижения пользовательского рисования. Кроме того, я создал новый класс из NSPopUpButton и использую cellClass, чтобы использовать для него мой производный класс. (т.е. я не работаю через конструктор интерфейса.)

Однако с появлением бета-версии macOS 10.14 эта процедура больше не вызывается, и я наблюдаю «обычный» (то есть ненастроенный) рисунок.

Благодаря @Marc T. answer я (думаю, что я) смог локализовать проблему в том факте, что Cell явно вызывает drawBorderAndBackgroundWithFrame:inView: только в том случае, если drawInteriorWithFrame:inView: реализовано в производной ячейке.

Я не мог найти надежную документацию по этому поводу. Есть ли?


person phimuemue    schedule 04.07.2018    source источник


Ответы (1)


Если бы в macOS 10.14 было бы такое изменение, я предполагаю, что Apple объявила бы об этом на WWDC 2018. Быстрая проверка в Interface Builder показала мне, что пока ничего не изменилось. Создание подкласса NSPopUpButtonCell для использования его в качестве класса для ячейки всплывающей кнопки по-прежнему работает должным образом. Что я должен упомянуть, так это то, что drawBorderAndBackground вызывается только в том случае, если drawInterior также реализован. Поскольку я никогда раньше не использовал drawBorderAndBackground, я не могу сказать, является ли это изменением предыдущих версий до 10.14 или нет.

class Cell: NSPopUpButtonCell {

override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) {
    super.drawInterior(withFrame: cellFrame, in: controlView)
    print("drawInterior")
}

override func drawBorderAndBackground(withFrame cellFrame: NSRect, in controlView: NSView) {
    super.drawBorderAndBackground(withFrame: cellFrame, in: controlView)
    print("drawBorderAndBackground")
}
}

Надеюсь это поможет.

person Marc T.    schedule 05.07.2018
comment
Я думаю, вы правы, что мне нужно реализовать drawInterior в моем производном классе. Как вы узнали об этом? Методом проб и ошибок? Можете ли вы указать мне на некоторые документы? - person phimuemue; 05.07.2018
comment
@phimuemue Интуитивно я программирую Cocoa уже более 10 лет :-) - person Marc T.; 06.07.2018
comment
@Марк Т Спасибо. Немного не по теме: я до сих пор считаю необычным проверять, реализует ли производный класс MethodA, чтобы решить, будем ли мы вызывать MethodB. Знаете ли вы другие примеры, когда Cocoa выполняет такую ​​проверку? - person phimuemue; 09.07.2018
comment
@phimuemue Я точно не помню, когда у меня возникли проблемы, но много раз это было связано с элементами управления, рисованием и событиями. - person Marc T.; 10.07.2018