0

Это простая программа, которая принимает два числа, вводимых пользователем в двух отдельных текстовых полях, и добавляет их вместе при нажатии кнопки «Добавить». То, как я это сделал, заключается в подклассе 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.S. Извините за раздражающее количество кода. Благодаря!

ответ

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 экземпляров. Вместо этого вам просто нужно получить & установить значение из существующих 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, потому что он ничего не делает, кроме преобразования строк в парные (и наоборот).

+0

Да, но мне нужно было знать, как избежать этих проблем во время подкласса, потому что это требует мой реальный проект. текст не является свойством на NSTextField, поэтому мне пришлось изменить _valueOne.text на [_valueOne stringValue]. Это сработало! Спасибо! Кроме того, означает ли это, что мне не нужен мой конструктор? – Ares

+0

Crap; вы правы в отношении свойства 'text'; Я думал о iOS 'UITextField'. Но на вашем «NSTextField» вы можете напрямую вызвать «doubleValue» и пропустить необходимость иметь дело со строкой вообще. – NRitH

+0

Что конкретно вам нужно для подкласса 'NSTextField'? – NRitH

Смежные вопросы