Swift:NSTextField numberStyle 不调用操作

标签 swift nstextfield nsnumberformatter

我有一个 NSTextField,我已使用以下代码设置:

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView?
{

    let cell : NSTableCellView? = tableView.makeViewWithIdentifier("AutomaticTableColumnIdentifier.0", owner: self) as! NSTableCellView?

    cell!.textField!.floatValue = 4.55
    let numberFormatter = NSNumberFormatter()
    numberFormatter.numberStyle = .CurrencyStyle
    numberFormatter.maximumFractionDigits = 0
    cell!.textField! = numberFormatter

    return cell
}

我还为 NSTextFieldDelegate 中的字段修改设置了一个 Action 。

@IBAction func saveCell(sender: AnyObject)
{
    print("saveCell")
}

我的问题是,仅当我输入与货币样式完全匹配的值时,才会触发 saveCell 操作。即输入 45 英镑是可以的,但是当我输入一个普通的 45 时没有任何反应。

如果我删除 NSNumberFormatter 那么它将接受任何条目,但不会按照我想要的方式格式化 textField。

如何接受没有货币符号的 45 值?执行此操作的最佳方法是什么?

最佳答案

您可以将 NSTextField 子类化如下:

import Cocoa

class CurrencyField: NSTextField {

    var percent: Double {
        return Double(Int(numbers) ?? 0) / 100
    }

    var currency: String {
        return Number.currency.string(from: percent.number) ?? ""
    }

    var numbers: String {
        return stringValue.components(separatedBy: CharacterSet(charactersIn: "0123456789").inverted).joined()
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        alignment = .right
        stringValue = currency

    }

    override func textDidChange(_ notification: Notification) {
        Swift.print("--> textDidChange")
        stringValue = currency
    }

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
        // Drawing code here.
    }
}

extension NumberFormatter {
    convenience init(numberStyle: NumberFormatter.Style) {
        self.init()
        self.numberStyle = numberStyle
    }
}

struct Number {
    static let currency = NumberFormatter(numberStyle: .currency)
}

extension Double {
    var number: NSNumber {
        return NSNumber(value: self)
    }
}

编辑/更新:

如果您需要一个整数字段,您可以按照以下步骤操作:

import Cocoa

class IntegerField: NSTextField {

    var value: Int { return Int(numbers) ?? 0 }

    var currency: String { return Number.currency.string(from: value.number) ?? "" }

    var numbers: String { return stringValue.components(separatedBy: CharacterSet(charactersIn: "0123456789").inverted).joined() }

    override func awakeFromNib() {
        super.awakeFromNib()
        alignment = .right
        stringValue = currency
    }
    override func textDidChange(_ notification: Notification) {
        Swift.print("--> textDidChange")
        stringValue = currency
    }
    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
        // Drawing code here.
    }
}

extension NumberFormatter {
    convenience init(numberStyle: NumberFormatter.Style, maximumFractionDigits: Int = 0) {
        self.init()
        self.numberStyle = numberStyle
        self.maximumFractionDigits = maximumFractionDigits

    }
}

struct Number {
    static let currency = NumberFormatter(numberStyle: .currency)
}

extension Int {
    var number: NSNumber {
        return NSNumber(value: self)
    }
}

关于Swift:NSTextField numberStyle 不调用操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39457186/

相关文章:

iOS 获取基于区域设置的号码描述

ios - 使用 parse 解包 Optional 值错误时意外发现 nil

ios - 在 Swift 中为一个 tabBarItem 设置 tintColor

macos - 注册网络历史记录通知处理程序时引发意外异常,出了什么问题?

objective-c - 调用 objc 静态库的 swift 应用程序出现链接错误

objective-c - 自动调整标签大小

objective-c - 覆盖 NSTextfield 中的 keydownevent

ios - 使用 NSNumberFormatter 的字符串复数器

java - 解析 FR 货币时出现 UnparseableNumberException

cocoa - TableView 中的自定义 NSTextField : how do I know if the row is selected to change the background color?