Я подклассифицировал 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
Я собираюсь вернуться и проверить раскадровку, чтобы выяснить, не может ли я уронить форматер в неправильном месте.