2011-06-13 113 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 
        } 
       } 
      } 
     } 
相關問題