Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa NSNumberFormatter不';不允许键入十进制数字_Cocoa_Macos_Nstextfield_Appkit_Nsnumberformatter - Fatal编程技术网

Cocoa NSNumberFormatter不';不允许键入十进制数字

Cocoa NSNumberFormatter不';不允许键入十进制数字,cocoa,macos,nstextfield,appkit,nsnumberformatter,Cocoa,Macos,Nstextfield,Appkit,Nsnumberformatter,我对使用NSNumberFormatter完全感到困惑。这应该是完全简单的,但我不能让它工作 我想设置一个NSTextField,允许键入十进制数字,可以是带小数点的,也可以不带小数点的。以下是我认为有效的方法: NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; [formatter setMinimu

我对使用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]最初将正确格式化数字,但如果我在上面键入,我将再次无法键入小数点


我错过了什么?你会认为这真的很简单

我意识到这已经晚了大约4年,但我只是遇到了同样的胡说八道,我想我会为子孙后代分享这个问题是什么(或可能是什么)

结果是,所有NSTextField的值访问器(
-objectValue
-stringValue
-doubleValue
,等等)最终都会调用
-ValidateEdit
-validateEditing
,依次使用附加的
NSFormatter
将编辑的文本转换为对象值,然后用重新格式化的值重置字段中的文本

因此,如果您有任何代码在用户编辑字段时监视该字段,并且您“偷看”该字段中的值,那么您就无意中重新格式化并重置了文本字段中的文本

并不是文本字段不允许您键入句点;这是因为文本字段中已经有“3”,当您键入句点时,文本将更改为“3”。如果您有一个action/notification/delegate方法,每当字段中的内容发生更改时都会运行,并且您调用了任何-typeValue方法,“3”。将格式设置为“3”,它会更新单元格,删除您刚才键入的时间段

我的方法是避免使用-typeValue方法,并查看
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 );

感谢并遵循@James Bucanek的回答:这是一个快速实现,我在使用
controlTextDidChange
委托方法时使用过,它解除了用户键入小数点的障碍。它还根据是否存在有效(即>零长度和非零长度字符串)条目,更新界面上按钮的
启用
标志:


发布解决方案永远不会太迟。我意识到这已经晚了2年,但我遇到了同样的胡说八道,我想我会和大家分享我是多么感激你的回答,伙计。非常感谢。我甚至不关心堆栈溢出的策略;你刚刚救了我,让我免于把头撞墙。我只希望有一天,我也能把一个开发伙伴从一个不合时宜的陷入困境的境地中解救出来。你救了我的命,伙计。非常感谢。
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
                    }
                }
            }
        }