我对 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] 最初将正确格式化数字,但如果我输入它,我将再次无法输入小数点。
我在这里缺少什么?你会认为这真的很简单
我意识到这已经晚了四年了,但我刚刚遇到了同样的废话,我想我应该为后代分享问题是什么(或可能是什么)。
事实证明, NSTextField 的所有值访问器(-objectValue
, -stringValue
, -doubleValue
,等等)最终都会调用-validateEditing
. -validateEditing
,反过来,使用附加的NSFormatter
将编辑后的文本转换为对象值,然后使用重新格式化的值重置字段中的文本.
因此,如果您有任何代码在用户编辑字段时监视该字段,并且您“查看”字段中的值,则您会无意中重新格式化并重置文本字段中的文本。
这并不是说文本字段不允许您输入句点;而是说文本字段不允许您输入句点。这是文本字段中已经有“3”,当您键入句点时,文本将更改为“3.”。如果您有一个操作/通知/委托方法,每当字段中的某些内容发生变化时就会运行,并且您调用任何 -type取值方法,即“3”。格式化为“3”,它会更新单元格,删除您刚刚输入的句点。
我的技巧是避免 -type价值方法并深入了解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 );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)