0

이것은 두 개의 별도 텍스트 필드에서 사용자가 입력 한 두 개의 숫자를 가져와 '추가'버튼을 클릭하면 함께 추가하는 간단한 프로그램입니다. 이 작업을 수행 한 방법은 NSTextField를 MyTextField라는 클래스로 서브 클래 싱하는 것입니다. 내 오류가 메모리 누수와 관련이 있다고 생각하지만 경험이 부족한 프로그래머이기 때문에 메모리를 할당하고 할당을 해제하는 방법을 잘 모릅니다.텍스트 필드의 정보가 유지되지 않습니다. 객차 c

문제는 : 추가 버튼을 클릭하면 완벽하게 작동합니다. 그러나 다시 클릭하면 정확한 양이 표시되지 않습니다. 입력을 0으로 출력하고 0을 계속 출력합니다. 코드를 첨부했습니다.

참고 : I 을 알아두면 훨씬 복잡해집니다! 나는 똑같은 오류를 표시하는 훨씬 복잡한 프로그램의 단순한 버전을 보여 주기만하면된다.

MyTextField.h

#import <Cocoa/Cocoa.h> 

@interface MyTextField : NSTextField 

@property (strong) NSString* number; 
@property double dblNum; 
-(id)initWithNumber:(NSString *)number; 
-(NSString *)getNumber; 
-(void)setNumber; 
-(double)getDblNum; 
-(void)setDblNum; 
-(double)calcSum:(MyTextField *)other; 
-(NSString *)description; 
@end 

MyTextField.m

#import "MyTextField.h" 

@implementation MyTextField 

-(id)initWithNumber:(NSString *)number{ 
    self = [super init]; 
    if (self) { 
     if ([number length] > 0){ 
      _number = number; 
     }else{ 
      _number = @"0"; 
     } 
     [self setDblNum]; 
    } 
    return self; 
} 
- (id)init { 
    return [self initWithNumber:[self getNumber]]; 
} 
-(NSString *)getNumber{ 
    return _number; 
} 
-(void)setNumber{ 
    _number = [self stringValue]; 
} 
-(double)getDblNum{ 
    return _dblNum; 
} 
-(void)setDblNum{ 
    _dblNum = [_number doubleValue]; 
} 
-(double)calcSum:(MyTextField *)other{ 
    return [self getDblNum] + [other getDblNum]; 
} 
- (NSString *)description{ 
    return [NSString stringWithFormat: @"Number: %f", _dblNum]; 
} 
@end 

ViewController.h

#import <Cocoa/Cocoa.h> 
#import "MyTextField.h" 

@interface ViewController : NSViewController 

@property (strong) IBOutlet MyTextField *valueOne; 
@property (strong) IBOutlet MyTextField *valueTwo; 
@property (strong) IBOutlet NSTextField *answer; 
- (IBAction)btnAdd:(id)sender; 

@end 

ViewController.m

#import "ViewController.h" 
#import "MyTextField.h" 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 

- (void)setRepresentedObject:(id)representedObject { 
    [super setRepresentedObject:representedObject]; 
} 

- (IBAction)btnAdd:(id)sender { 
    _valueOne = [[MyTextField alloc] initWithNumber:[_valueOne stringValue]]; 
    _valueTwo = [[MyTextField alloc] initWithNumber:[_valueTwo stringValue]]; 
    double ans = [_valueOne calcSum:_valueTwo]; 
    _answer.stringValue = [NSString stringWithFormat:@"%.2f", ans]; 
} 
@end 

P. 성가신 양의 코드를 유감스럽게 생각합니다. 감사!

답변

2

btnAdd:은 문제가있는 곳입니다.

- (IBAction)btnAdd:(id)sender { 
    _valueOne = [[MyTextField alloc] initWithNumber:[_valueOne stringValue]]; 
    _valueTwo = [[MyTextField alloc] initWithNumber:[_valueTwo stringValue]]; 
    double ans = [_valueOne calcSum:_valueTwo]; 
    _answer.stringValue = [NSString stringWithFormat:@"%.2f", ans]; 
} 

버튼을 탭 때마다, 당신은 모두 MyTextField 인스턴스를 다시 이야. 당신이 valueOnevalueTwo 텍스트 문자열의 유효성을 검사 할 필요가 분명히

- (IBAction)btnAdd:(id)sender { 
    double value1 = [_valueOne.text doubleValue]; 
    double value2 = [_valueTwo.text doubleValue]; 
    double ans = value1 + value2; 
    _answer.stringValue = [NSString stringWithFormat:@"%.2f", ans]; 
} 

대신, 당신은 단순히 같이, 기존의 valueOnevalueTwo 콘센트에서 &이 값을 설정 얻을 필요가있다.

실제로는 MyTextField 하위 클래스가 필요하지 않습니다. 문자열을 이중으로 변환하는 것 외에는 아무것도 수행하지 않기 때문입니다 (반대의 경우도 마찬가지입니다).

+0

네,하지만 실제 프로젝트에 필요하기 때문에 서브 클래 싱하는 동안 이러한 문제를 피하는 방법을 알아야했습니다. 텍스트는 NSTextField의 속성이 아니므로 _valueOne.text를 [_valueOne stringValue]로 변경해야했습니다. 이것은 일했다! 정말 고마워! 또한, 내 생성자가 필요 없다는 의미입니까? – Ares

+0

쓰레기; 당신은'text' 속성에 대해 옳습니다; 나는 IOS의'UITextField'를 생각하고 있었다. 그러나'NSTextField'에서'doubleValue'를 직접 호출하고 문자열을 처리해야하는 것을 건너 뛸 수 있습니다. – NRitH

+0

특별히'NSTextField'를 하위 클래스로 만들 필요가 있습니까? – NRitH

관련 문제