我已经为我的特定用途创建了一个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 {
...
我相信我从tableview获取tableviewcell的标识符,而不是创建一个新的,因此应该有它的textfield。我阅读了文档,这似乎是正确的方法。如果我在这里获得单元格后设置了数字格式,它就可以了。但我不想这样做,因为我不想要一个巨大的case语句来设置特定的单元格属性 - 我想在storyboard编辑器中这样做。
关于如何使用故事板编辑器设置数字格式的任何建议?
编辑:除此之外,我在我设置textfield的stringvalue的地方放置了一个断点,文本设置如下:
textfield.stringValue = text
查看数字格式化程序在调试器中的位置,它设置在表列级别 - 这似乎不正确。但它肯定仍然存在,并没有以某种方式写。
(lldb) e ((tableColumn?.dataCell as! NSTextFieldCell).formatter as! NumberFormatter).format
(String) $R14 = "#,##0.00####;0.00;(#,##0.00####)"
textfield的格式化程序是零......很奇怪。
(lldb) e textfield.formatter
(Formatter?) $R26 = nil
我要回去查看故事板,看看是否可能将格式化程序放在错误的位置。
好了,明白了。我显然是MacOS开发的一个菜鸟,我只是相信将数字格式化程序放到我想要的列中会把它放在单元级别......这不是真的!
在此图像中,如果您希望格式化单元格,则可以看到正确和错误的方法。正确的方法是突出的。您必须向上打开层次结构,直到单元格的文本字段。错误的方法在上面,您将在“文本单元格”下看到它,这实际上是列的文本单元格。
感谢所有坚持我的人,并试着帮助我。我希望这个答案可以帮助将来的其他人像我刚才那样避免几天的挫折!
同样正如@Willeke所指出的那样,如果你所做的只是设置这些属性,那么就没有必要对numberformatter进行子类化。我要去做,因为我有很多单元格,我想分享一个共同的格式,但如果你所做的只是格式化一个单元格,那就不需要了。