2011-06-13 2 views
7

NSNumberFormatter를 사용하여 완전히 당혹 스럽습니다. 이 작업은 완전히 간단해야하지만 제대로 작동하지 않습니다.NSNumberFormatter에서 십진수를 입력 할 수 없습니다.

10 진수를 입력 할 수 있도록 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"형식으로 가져 와서 방금 입력 한 기간을 지우면서 셀을 업데이트합니다.

// 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

+0

나는 이것이 2 년 정도 늦었다는 것을 알고있다. 그러나 나는이 말도 안되는 생각에 부딪쳤다. 나는 너의 대답에 대해 얼마나 고마워 하는지를 나눌 줄 알았다. 고맙습니다! Stack Overflow의 정책에 대해서도 신경 쓰지 않습니다. 당신은 방금 벽을 통해 머리를 가꾸지 못하게했습니다. 나는 언젠가 나도 예기치 않게 머리가 맞지 않는 상황에서 동료 개발자를 구할 수 있기를 희망합니다. Updoot. –

1

감사와 @ 제임스 Bucanek의 대답에서에 다음 -validateEditing를 트리거하지 않고, 유형 값 방법과 직접 편집 텍스트를 얻을 수있는 NSText 객체로 슬쩍 -

내 해킹은을 피하기 위해이었다 : 사용자가 소수점을 입력하는 것을 차단 해제 한 controlTextDidChange 위임 메소드를 지나칠 때 사용했던 Swift 구현입니다. 또한 유효한 (즉> 제로 0이 아닌 길이 문자열) 항목이 있는지에 따라 인터페이스에 버튼의 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 
        } 
       } 
      } 
     } 
관련 문제