2011-06-13 107 views
7

我完全被NSNumberFormatter弄糊涂了。这应该是非常简单的,但我无法让它工作。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]中投掷会初始格式化数字,但如果我输入它,我再次无法输入小数点。

我在这里错过了什么?你会认为这会很简单

回答

8

我意识到这大概是4年太晚了,但我只是碰到了这个废话,以为我会分享后代的问题(或可能)。

事实证明,所有的NSTextField的值访问器(-objectValue-stringValue-doubleValue,等等)都最终调用-validateEditing。反过来,-validateEditing使用附加的NSFormatter将编辑后的文本转换为对象值,然后使用重新格式化的值重置字段中的文本。

因此,如果您有任何代码在用户编辑它时观察该字段,并且您在该字段中查看该值,则会无意中重新格式化并重置文本字段中的文本。

这并不是说文本字段不会让你输入一个句点,而是文本字段中已经有“3”,当你输入一个句点时,文本变为“3.”。如果你有一个行动/通知/委托方法,只要在该领域的某些事情发生变化时运行,并且你打电话给类型值方法,那么“3.”格式化为“3”,并更新单元格,擦除刚输入的时间段。

我的手笔,以避免 - 类型值的方法和不期而遇的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); 
+0

它永远不会太晚发布的解决方案。这为我修好了。 – user965972 2016-01-14 12:09:19

+0

我意识到这大概晚了2年,但我只是碰到了同样的废话,我想分享我多么感激你的答案,男人。谢谢!我甚至不关心Stack Overflow的政策;你只是救了我把我的头穿过墙壁。我只希望有一天,我也能从一个不合时宜的头脑中陷入困境的情况下挽救一位开发人员。 Updoot。 – 2017-11-13 00:16:58

1

感谢和@詹姆斯Bucanek的回答下面就:这是我在使用controlTextDidChange委托方法时使用的Swift实现,它可以阻止用户输入小数点。它也可以根据是否有一个有效的(即>零和非零长度字符串)进入更新界面上的按钮的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 
        } 
       } 
      } 
     } 
相关问题