NSTextView рисует черный на почти черном в темном режиме - PullRequest
0 голосов
/ 16 октября 2018

Когда я собираю приложение macOS в темном режиме, некоторые из моих текстовых представлений (NSTextView) отображают черный текст на почти черном фоне.В Интерфейсном Разработчике в Инспекторе Атрибутов «Цвет текста» установлен на систему «По умолчанию (Цвет текста)», что я считаю правильным.Действительно, в Интерфейсном Разработчике этот текст при желании отображает белый цвет в Темном режиме и черный в Светлом.Я искал в своем коде любые строки, в которых я мог бы программно установить цвет текста в этом представлении на черный, но не могу найти ни одной.Почему мой текст всегда черный?

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

Если вы используете простой текст в NSTextView (потому что вам нужен, например, scrollview), просто свяжитесь со свойством value вместо attributedString.Эта привязка будет использовать настройку цвета текста элемента управления и отлично работает с Dark Mode.

0 голосов
/ 23 апреля 2019

Расширение NSTextView для «простых» (без атрибутов) строк.Работает в светлом или темном режиме:

extension NSTextView {
    static let DefaultAttribute =
        [NSAttributedString.Key.foregroundColor: NSColor.textColor] as [NSAttributedString.Key: Any]

    var stringValue: String {
        return textStorage?.string ?? ""
    }

    func setString(_ string: String) {
        textStorage?.mutableString.setString("")
        append(string)
    }

    func append(_ string: String) {
        let attributedText = NSAttributedString(string: string, attributes: NSTextView.DefaultAttribute)
        textStorage?.append(attributedText)
    }
}
0 голосов
/ 16 октября 2018

Я заметил, что у ошибочных текстовых представлений есть привязанная «строка приписывания» с привязками Какао к методам, которые возвращают простые, не приписанные объекты NSString.Я, вероятно, сделал это, потому что мне было лень, когда я писал это приложение много лет назад, и оно работало нормально.Это несоответствие оказалось проблемой.Исправление состоит в том, чтобы изменить эти методы, чтобы они возвращали NSAttributedString со словарем атрибутов, содержащим пару ключ / значение

NSForegroundColorAttributeName : NSColor.controlTextColor

Вероятно, произошло то, что Какао было разработано для делать то, что вы, вероятно, хотите когда связываемая строка получает атрибут без строки.Вместо исключения исключений, Какао применяет некоторые атрибуты «по умолчанию», которые включают черный цвет текста, который был по умолчанию в macOS с 1984 года - совершенно разумно, пока не появился Dark Mode!Что ж, было бы неплохо, чтобы Apple изменила это значение по умолчанию с черного на controlTextColor, но, видимо, они этого не сделали.

Заключение: Мы больше не можем избежать связывания атрибутивной строки текстового представления с простой неатрибутированной строкой.

Или вы можете использовать ответиз @Ely и привязка к value.Но если вы попробуете это и не увидите привязку value в Инспекторе привязок, но увидите привязку data, это происходит из-за этих замечаний в документации NSTextField:

[value] привязка доступна, только если NSTextView настроен для отображения с использованием одного шрифта.

и более поздних версий

[data] доступна только для привязкикогда NSTextView настроен для разрешения нескольких шрифтов.

Получается, что они означают , настроенный для разрешения нескольких шрифтов , заключается в том, что в инспекторе атрибутов Разрешает расширенноеТекст флажок включен.И наоборот, , настроенный для отображения с использованием одного шрифта, означает, что флажок Разрешить расширенный текст выключен.

...