我对使用NSNumberFormatter感到很困惑。这应该是完全简单的,但我无法让它发挥作用。
我想设置NSTextField以允许输入带小数点或不带小数点的十进制数字。以下是我认为可行的方法:
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMinimumFractionDigits:0];
[formatter setMaximumFractionDigits:4];
[formatter setAllowsFloats:YES];
[[timeFlowMultiplierTF cell] setFormatter:formatter];
但是,在文本字段中键入时,按小数点的“句点”键不会产生一个。键入“3.14”给我“314”。抛出[formatter setAlwaysShowsDecimalSeparator:YES]将最初正确格式化数字,但如果我输入它,我再次无法输入小数点。
我在这里缺少什么?你会认为这很简单
答案 0 :(得分:11)
我意识到这已经太晚了4年,但我只是遇到了同样的废话,并且认为我会分享问题(或者可能是)的后代。
事实证明,NSTextField(-objectValue
,-stringValue
,-doubleValue
等等)的所有值访问器都会调用-validateEditing
。反过来,-validateEditing
使用附加的NSFormatter
将已编辑的文本转换为对象值 ,然后使用重新格式化的值重置字段中的文本 < /强>
因此,如果您有任何代码可以在用户编辑该字段时监视该字段,并且您可以查看&#34; peek&#34;在该字段中的值,您无意中重新格式化并重置文本字段中的文本。
不是文本字段不会让你键入一个句号;这就是文本字段已经有了#34; 3&#34;在其中,当您键入句点时,文本将更改为&#34; 3。&#34;。如果你有一个action / notification / delegate方法,只要字段中的某些内容发生变化就会运行,并且你调用任何 - type Value方法,&#34; 3。&#34;格式化为&#34; 3&#34;它会更新单元格,删除刚输入的句点。
我的黑客是避免使用 - 类型值方法并查看NSText
对象以直接获取编辑后的文本,而不会触发-validateEditing
:
// some method that runs every time the field changes...
NSTextField* valueField = self.valueField;
NSNumberFormatter* fieldFormatter = valueField.formatter;
NSText* fieldEditor = valueField.currentEditor;
id newValue = ( fieldEditor!=nil ? [fieldFormatter numberFromString:fieldEditor.string] : valueField.objectValue );
答案 1 :(得分:1)
感谢@James Bucanek的回答:这是我在使用controlTextDidChange
委托方法时使用的Swift实现,该方法取消阻止用户输入小数点。它还根据是否有效(即&gt;零和非零长度字符串)条目更新接口上按钮的enabled
标志:
override func controlTextDidChange(notification: NSNotification) {
if let formatter: NSNumberFormatter? = self.user_textfield.formatter as? NSNumberFormatter {
if let field_editor: NSText = self.user_textfield.currentEditor() {
if let new_value: Float? = formatter!.numberFromString(field_editor.string!)?.floatValue {
self.my_button_out.enabled = new_value > 0.0
} else {
self.my_button_out.enabled = false
}
}
}
}