文本字段中的信息不会保留 objective c

Information in text fields do not get retained objective c

这是一个简单的程序,它接受用户在两个单独的文本字段中输入的两个数字,并在单击 'Add' 按钮时将它们相加。我这样做的方法是将 NSTextField 子 class 转换为名为 MyTextField 的 class。我相信我的错误与内存泄漏有关,但作为一个没有经验的程序员,我不太确定如何处理分配和释放内存。

问题是:当我点击“添加”按钮时,效果很好。然而,当我再次点击它时,它并没有显示正确的金额。它一直将我的输入视为 nil 并输出 0。我附上了我的代码。

注意:我知道这比它需要的要复杂得多!我只是展示了一个更复杂的程序的更简单版本,它显示了完全相同的错误。

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.S。很抱歉烦人的代码量。谢谢!

你的 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 子类,因为它除了将字符串转换为双精度(反之亦然)之外什么都不做。