Числовой формат в подклассах в NSTableView не форматируется - PullRequest
1 голос
/ 24 марта 2019

Я подклассифицировал NumberFormatter для своего конкретного использования, и он прекрасно работает, когда я вызываю его из кода. Вот подкласс:

    class MyNumberFormatterUnitPrice: NumberFormatter {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    override init() {
        super.init()
        setup()
    }

    private func setup() {
        self.format = "#,##0.00####;(#,##0.00####)"
        self.numberStyle = .currencyAccounting
    }

}

Я делаю это, потому что, хотя в раскадровке можно установить положительные и отрицательные форматы, вы не можете установить их и "currencyAccounting". Однако, когда я создаю NumberFormatter в раскадровке, выбираю этот подкласс, а затем помещаю его под текстовую ячейку для столбца, который я хочу отформатировать, он переопределяется в пределах:

tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView?

Здесь я сейчас устанавливаю ячейку с помощью этой логики:

let cellIdentifier = tableColumn!.identifier.rawValue
            if let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(cellIdentifier), owner: nil) as? NSTableCellView {
                ...

Я полагаю, что я получаю ячейку табличного представления из табличного представления по его идентификатору, а не создаю новый, поэтому вместе с ним должно быть текстовое поле. Я прочитал документацию, и это, кажется, правильный способ сделать это. Если я установлю числовой формат после того, как получу ячейку, это сработает. Но я не хочу делать это таким образом, потому что я не хочу, чтобы гигантский оператор case устанавливал определенные свойства ячейки - я хотел бы сделать это в редакторе раскадровки.

Какой-нибудь совет, как использовать редактор раскадровки для установки числового формата?

Редактировать: В дополнение к этому, я установил точку останова внутри, где я устанавливаю строковое значение текстового поля, а текст устанавливается следующим образом:

textfield.stringValue = text

Глядя на то, где находится форматировщик чисел в отладчике, он установлен на уровне столбцов таблицы - это не так. Но он определенно все еще там и не был как-то переписан.

(lldb) e ((tableColumn?.dataCell as! NSTextFieldCell).formatter as! NumberFormatter).format
(String) $R14 = "#,##0.00####;0.00;(#,##0.00####)"

А форматировщик текстового поля ноль ... странный.

(lldb) e textfield.formatter
(Formatter?) $R26 = nil

Я собираюсь вернуться и проверить раскадровку, чтобы выяснить, не может ли я уронить форматер в неправильном месте.

1 Ответ

0 голосов
/ 25 марта 2019

Хорошо, что понял.Я, очевидно, новичок в разработке MacOS, и я просто верил, что добавление средства форматирования чисел в столбец, который я хотел, поместит его на уровне ячеек ... это НЕ верно!.

enter image description here

На этом изображении вы можете увидеть правильный и неправильный способ сделать это, если вы ожидаете отформатировать ячейку.Правильный путь выделен.Вы должны открыть иерархию вверх вплоть до текстового поля для ячейки.Неправильный путь выше, и вы увидите его под «текстовой ячейкой», которая на самом деле является текстовой ячейкой для столбца .

Спасибо всем, кто оставался со мной и пытался помочь мнена этом.Я надеюсь, что этот ответ поможет другим в будущем избежать нескольких дней разочарования, как я только что!

Кроме того, как указывает @Willeke, нет никакой реальной необходимости создавать подклассы для числового формата, если все, что вы делаете, это устанавливаете эти свойства,Я собираюсь сделать это, потому что у меня есть много ячеек, которые я хочу использовать в общем формате, но если все, что вы делаете - это форматирование одной ячейки, это не нужно.

...