文本字段中的信息不会保留 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
实例。相反,您只需要从现有的 valueOne
和 valueTwo
网点获取和设置值,例如:
- (IBAction)btnAdd:(id)sender {
double value1 = [_valueOne.text doubleValue];
double value2 = [_valueTwo.text doubleValue];
double ans = value1 + value2;
_answer.stringValue = [NSString stringWithFormat:@"%.2f", ans];
}
显然,您需要检查 valueOne
和 valueTwo
文本字符串的有效性。
您真的不需要 MyTextField
子类,因为它除了将字符串转换为双精度(反之亦然)之外什么都不做。
这是一个简单的程序,它接受用户在两个单独的文本字段中输入的两个数字,并在单击 '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
实例。相反,您只需要从现有的 valueOne
和 valueTwo
网点获取和设置值,例如:
- (IBAction)btnAdd:(id)sender {
double value1 = [_valueOne.text doubleValue];
double value2 = [_valueTwo.text doubleValue];
double ans = value1 + value2;
_answer.stringValue = [NSString stringWithFormat:@"%.2f", ans];
}
显然,您需要检查 valueOne
和 valueTwo
文本字符串的有效性。
您真的不需要 MyTextField
子类,因为它除了将字符串转换为双精度(反之亦然)之外什么都不做。