これは、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.迷惑なコードを残して申し訳ありません。ありがとう!
はい、実際のプロジェクトではサブクラス化の際にこれらの問題を回避する方法を知る必要がありました。テキストはNSTextFieldのプロパティではないので、_valueOne.textを[_valueOne stringValue]に変更する必要がありました。これはうまくいった!本当にありがとう!また、私はコンストラクタが必要ないということですか? – Ares
クラップ;あなたは 'text'プロパティについて正しいです。私はiOSの 'UITextField'を考えていました。しかし、あなたの 'NSTextField'では、' doubleValue'を直接呼び出すことができ、文字列を扱う必要はありません。 – NRitH
特に 'NSTextField'をサブクラス化する必要がありますか? – NRitH