首页 > 解决方案 > NSTableView 中的子类 NumberFormatter 未格式化

问题描述

我为我的特定用途对 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 而不是创建一个新的,所以它应该有它的文本字段。我阅读了文档,这似乎是正确的方法。如果我在此处获取单元格后设置了 numberformatter,则它可以工作。但我不想这样做,因为我不想要一个巨大的案例语句来设置特定的单元格属性——我想在故事板编辑器中这样做。

关于如何使用情节提要编辑器设置数字格式化程序的任何建议?

编辑:除此之外,我在设置文本字段的字符串值的位置放置了一个断点,并且文本设置如下:

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

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

标签: swiftxcodeinterface-buildernstableviewnsnumberformatter

解决方案


好的,明白了。我显然是 MacOS 开发的菜鸟,我只是相信将数字格式化程序放入我想要的列中会将它放在单元格级别......这不是真的!

在此处输入图像描述

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

感谢所有坚持我并试图帮助我的人。我希望这个答案能帮助其他人在未来避免像我刚刚经历的几天的挫败感!

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


推荐阅读