У меня есть NSButtons в NSTableView, точно так же, как в моем другом вопросе здесь.
Я реализовал переключение между «Темным режимом» и «Обычным режимом» с помощью NSAppearance в окне в NSWindowController:
override public func windowDidLoad() {
if darkModeOn {
setDarkMode()
} else {
setLightMode()
}
}
func setDarkMode() {
window?.appearance = NSAppearance(named: NSAppearanceNameVibrantDark)
window?.backgroundColor = nil
}
func setLightMode() {
window?.appearance = nil
window?.backgroundColor = .white
}
Кнопки имеют свой атрибут isTemplate
равным true
, поэтому их цвет является обратным цвету окна.
Легкий:
Темный:
Это работает нормально, когда приложение запускается: кнопки черные, когда окно белое, и белые, когда окно темное.
Но это больше не работает, когда приложение уже запущено.
После запуска приложения, если я вызываю setDarkMode()
, когда окно белое, я внезапно получаю черные или серые кнопки вместо желаемых белых.
То же самое, если я позвоню setLightMode()
, когда окно темное.
В обоих случаях кнопки возвращаются в нормальное состояние, как только я прокручиваю tableView назад и вперед достаточно, чтобы принудительно перерисовать ячейки.
Обратите внимание на еще один побочный эффект переключения состояния окна: некоторые разделители строк tableView внезапно становятся толще, а также снова становятся нормальными после прокрутки.
Как вы можете себе представить, я не хочу, чтобы пользователь был вынужден выйти из приложения и перезапустить его, поэтому я хотел бы, чтобы все эти вещи правильно отображались в окне при изменении NSAppearance.
К сожалению, я пробовал много решений без успеха: комбинации needsDisplay
и других способов принудительного «обновления» кнопок (и разделителей строк tableView) не имели никакого эффекта. Документация скудная. Я посмотрел все видео WWDC. Я потерялся. :п