NSTableView中子类化的NumberFormatter无法格式化

时间:2019-03-24 13:07:01

标签: swift xcode interface-builder nstableview nsnumberformatter

我为特定用途将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的,而不是创建一个新的id,因此应该将其文本字段与之一起。我阅读了文档,这似乎是正确的方法。如果我在此处获得单元格后设置了numberformatter,那么它将起作用。但是我不想这样做,因为我不想使用大型的case语句来设置特定的单元格属性-我想在情节提要编辑器中做到这一点。

关于如何使用情节提要编辑器设置numberformatter的任何建议?

编辑:此外,我在设置文本字段的stringvalue的地方放置了一个断点,并且文本的设置如下:

textfield.stringValue = text

查看数字格式化程序在调试器中的位置,它是在表列级别设置的-似乎不太正确。但是它肯定仍然存在,并且还没有以某种方式被编写。

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

文本字段的格式化程序为nil ...很奇怪。

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

我要回去检查情节提要,以查看是否将格式化程序放在错误的位置。

1 个答案:

答案 0 :(得分:0)

确定。我显然是MacOS开发的菜鸟,我只是相信将数字格式化程序放到我想要的列中是为了将其放在单元格级别上……那是不对的!。

enter image description here

在此图像中,如果您希望格式化单元格,则可以看到正确错误的方法。正确的方法将突出显示。您必须直接在单元格的文本字段中向下打开层次结构。上面的方法有误,您会在“文本单元格”下看到它,该文本单元格实际上是的文本单元格。

感谢所有坚持我并尝试帮助我的人。我希望这个答案能在将来帮助别人避免像我刚经历的几天一样沮丧!

正如@Willeke指出的那样,如果您要做的只是设置这些属性,则没有必要真正地将numberformatter子类化。之所以这样做,是因为我有很多单元格想要共享一种通用格式,但是如果您要做的只是格式化一个单元格,则不需要。