Как вернуть светлую/темную тему пользовательского интерфейса приложения Mac по умолчанию в Objective C?

#objective-c #macos #qt #darkmode

Вопрос:

В моем приложении Qt я хочу предоставить пользователю возможность установить светлую/темную тему своего приложения на:

  1. То же, что и тема операционной системы
  2. Свет (игнорируя тему операционной системы)
  3. Темный (игнорируя тему операционной системы)

Для 1. Я могу просто разработать тему операционной системы, используя эту цель C:

 bool macIsInDarkTheme()
{
    if (__builtin_available(macOS 10.14, *))
    {
        auto appearance = [NSApp.effectiveAppearance bestMatchFromAppearancesWithNames:
                @[ NSAppearanceNameAqua, NSAppearanceNameDarkAqua ]];
        return [appearance isEqualToString:NSAppearanceNameDarkAqua];
    }
    return false;
}
 

Для 2. Я могу назвать эту цель C:

 void macSetToLightTheme()
{
    if (__builtin_available(macOS 10.14, *))
    {
        [NSApp setAppearance:[NSAppearance appearanceNamed:NSAppearanceNameAqua]];
    }
}
 

Для 3. Я могу назвать эту цель C:

 void macSetToDarkTheme()
{
   if (__builtin_available(macOS 10.14, *))
   {
        [NSApp setAppearance:[NSAppearance appearanceNamed:NSAppearanceNameDarkAqua]];
   }
}
 

Все это работает. Проблема возникает, если пользователь хочет перейти от 2. или 3. обратно к 1. Как вернуть внешний вид по умолчанию, чтобы получить его из операционной системы? Я программист на C и на самом деле не имею никакого опыта работы с Objective C.

Ответ №1:

Установка внешнего вида приложения на ноль должна соответствовать поведению по умолчанию (внешний вид унаследован от системных настроек).:

 [NSApp setAppearance:nil];
 

https://developer.apple.com/documentation/appkit/nsapplication/2967170-appearance?язык=objc

Если значение этого свойства равно нулю (по умолчанию), AppKit применяет текущий внешний вид системы к элементам пользовательского интерфейса приложения, включая его окна, представления, панели и всплывающие окна. Присвоение этому свойству объекта NSAppearance приводит к тому, что элементы интерфейса приложения вместо этого принимают указанный внешний вид.

Комментарии:

1. Спасибо, я это проверю.