2012-01-26 3 views
1

숫자가 텍스트 필드에 입력되는 간단한 코코아 응용 프로그램을 만들려고합니다. 한 텍스트 필드에 숫자가 입력되면 다른 텍스트 필드는 다른 숫자로 자동 업데이트됩니다 (반대의 경우도 마찬가지 임). 창으로 드래그 한 텍스트 필드는 인터페이스 빌더의 "숫자 포맷터가있는 텍스트 필드"입니다. 텍스트 필드를 대리인으로 설정하여 자동으로 업데이트되도록합니다. 그러나 서식이 제대로 작동하지 않는 것 같습니다. 십진수를 입력 할 수 없습니다. 도와주세요!!! 여기Number Formatter가있는 NSTextField가 소수점 이하 입력을 허용하지 않습니다.

헤더 파일 : 여기

#import <Cocoa/Cocoa.h> 

@interface AppDelegate : NSObject <NSApplicationDelegate> { 
    IBOutlet NSTextField *number1; 
    IBOutlet NSTextField *number2; 
} 

@property (assign) IBOutlet NSWindow *window; 

@end 

실행 파일 :

#import "AppDelegate.h" 

@implementation AppDelegate 

@synthesize window = _window; 

-(void)controlTextDidChange:(NSNotification *) note { 
    NSTextField *changedField = [note object]; 

    if (changedField == number1) { 
     float num1 = [number1 floatValue]; 
     [number2 setFloatValue: (num1*2.0)]; 
    } 

    if (changedField == number2) { 
     float num2 = [number2 floatValue]; 
     [number1 setFloatValue: (num2/2.0)]; 
    } 
} 

@end 

답변

1

이 조금 불분명,하지만 당신이 정말로 일을 할 수없는 일을하려고하고 있지만 대안이있다. 코드에서

당신은이 :

float num1 = [number1 floatValue]; 
[number2 setFloatValue: (num1*2.0)]; 

첫 번째 줄은 number1현재 값을 요청합니다. number1에 부착 된 숫자 포맷터를 사용하면 텍스트 서식을 지정하고 ... 입력 한 경우 123.이이 때 서식이 지정된 결과는 123 ...이며 소수점은 사라집니다. 쉼표 (천 단위 구분 기호)를 입력 할 수 없음을 알 수 있습니다.

그래서 근본적인 문제는 후 모든 문자 코드가 그 시점에 유효한 숫자 로 그것을 강요 입력 된 것입니다.

다른 방법으로는 사용자가 전체 번호를 입력 한 경우에만 작업을 수행하는 것입니다. 각 문자가 입력 될 때 입력을 분석하기 위해 직접 코드를 작성하거나 사용자가 동작에 응답하고 응답 할 때까지 기다리는 빠르고 쉬운 방법을 사용할 수 있습니다.

는에 후자의 변화 당신의 코드를 수행합니다

- (IBAction) textDidChange:(id)sender 
{ 
    if (sender == number1) 
    { 
     float num1 = [number1 floatValue]; 
     [number2 setFloatValue: (num1*2.0)]; 
    } 
    else if (sender == number2) 
    { 
     float num2 = [number2 floatValue]; 
     [number1 setFloatValue: (num2/2.0)]; 
    } 
} 

당신이 이미 가지고있는 "위임"연결을 "선택"으로 컨트롤에 연결하고 제거 할 수 있습니다.

이 솔루션은 시도한 것보다 덜 동적이지만 효과가 있습니다. 동적 응답을 다시 얻으려면 위에서 언급 한 것처럼 더 복잡한 코드를 작성해야합니다.

+0

덜 동적 인 접근 방식에 대해 제안한 변경 사항을 적용하고 10 진수를 입력 할 수있게했습니다. 문제? - 텍스트 필드의 서식을 지정하면 45와 같이 45로 표시되는 유효 자릿수가 표시됩니다. – wigging

+0

올바르게 동적으로 구현할 수있는 예제 코드를 제공하면 정말 감사하겠습니다. – wigging

+0

@Gavin :'NSNumberFormatter'에서'setMinimumFractionDigits :'와 같은 메소드를 볼 수 있습니다. (그리고 여러분은'NSTextField'의'formatter' 메소드를 사용하여 포맷터를 사용할 수 있습니다.) 동적 접근법을 사용하여 이러한 메소드를 사용하고 싶지만 (그리고 소수점 표시를위한 메소드가 있음) 유혹을받을 수도 있지만, 사용자가 입력 할 때 입력하는 내용을 변경하면 커서가 변경되지 않으므로 매우 이상한 동작을 보일 수 있습니다 그들이 생각하는 곳은 ... – CRD

0

조금 늦었지만 동적 인 업데이트를 유지하면서 포매터가 너무 일찍 시작되는 것을 피하면서 사용자가 분수를 입력하지 못하게하는 간결한 솔루션을 찾았습니다.

- (void)controlTextDidChange:(NSNotification *)aNotification 
{ 
    NSTextView *fieldEditor = [aNotification.userInfo valueForKey:@"NSFieldEditor"]; 
    CGFloat floatValue = fieldEditor.textStorage.string.floatValue; 
    // Getting the new value from the field editor avoids the formatter kicking in here. 
    // You can now use the value as you wish. Probably something like: 
    if (sender == number1) 
    { 
     [number2 setFloatValue: (floatValue*2.0)]; 
    } 
    else if (sender == number2) 
    { 
     [number1 setFloatValue: (floatValue/2.0)]; 
    } 
} 

는 (필자는 브라우저에이를 입력, 그래서 완전히 정확하지 않을 수 있습니다,하지만 충분히 가까이 있어야 필수 부분은 처음 두 행은 다음과 같습니다. 필드 편집기를 추출하고 그것에서 새로운 값을 추출합니다.

1

나는 아주 늦은 대답을 알고 있지만 정확히 똑같은 문제를 만났고 멋진 해결 방법을 찾았습니다 .Bui @ CRD의 답을 찾는다.나는이 문제를 수행하는 방법

은 다음과 같습니다

  • 스토어 포맷터
  • 텍스트 필드에서 포맷터를 닦아
  • 가 텍스트 필드에 포맷터를 다시 적용 텍스트 필드
  • 에서 값을 읽어

내가 한 일례는 다음과 같습니다.

-(void)controlTextDidChange:(NSNotification *)obj 
{ 
    if ([obj object]) 
    { 
     NSTextField *field = [obj object]; 
     NSNumberFormatter *formatter = [field formatter]; 
     [field setFormatter:nil]; 
     double data = [field doubleValue]; 
     [field setFormatter:formatter]; 
     // ... 
     // Do other meaningful stuff now 
    } 
} 

올바른 방법인지는 잘 모르지만 잘 작동하는지 확인하십시오.

관련 문제