0

これは、2つの別々のテキストフィールドでユーザーが入力した2つの数値を取り、[追加]ボタンをクリックしたときにそれらを加算する単純なプログラムです。私がこれをやったのは、NSTextFieldをMyTextFieldというクラスにサブクラス化することです。私は自分のエラーがメモリリークと関係していると信じていますが、経験の浅いプログラマであるため、メモリの割り当てと解放をどう扱うべきかについてはあまりよく分かりません。テキストフィールドの情報が保持されていませんc

問題は次のとおりです。[追加]ボタンをクリックすると、完全に機能します。しかし、もう一度クリックすると、正しい量が表示されません。私の入力をゼロにして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サブクラスは必要ありません。なぜなら、文字列を2倍に変換すること以外は何もしないからです(またその逆もあります)。

+0

はい、実際のプロジェクトではサブクラス化の際にこれらの問題を回避する方法を知る必要がありました。テキストはNSTextFieldのプロパティではないので、_valueOne.textを[_valueOne stringValue]に変更する必要がありました。これはうまくいった!本当にありがとう!また、私はコンストラクタが必要ないということですか? – Ares

+0

クラップ;あなたは 'text'プロパティについて正しいです。私はiOSの 'UITextField'を考えていました。しかし、あなたの 'NSTextField'では、' doubleValue'を直接呼び出すことができ、文字列を扱う必要はありません。 – NRitH

+0

特に 'NSTextField'をサブクラス化する必要がありますか? – NRitH

関連する問題