Это простая программа, которая принимает два числа, вводимых пользователем в двух отдельных текстовых полях, и добавляет их вместе при нажатии кнопки «Добавить». То, как я это сделал, заключается в подклассе 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. Извините за раздражающее количество кода. Благодаря!
Да, но мне нужно было знать, как избежать этих проблем во время подкласса, потому что это требует мой реальный проект. текст не является свойством на NSTextField, поэтому мне пришлось изменить _valueOne.text на [_valueOne stringValue]. Это сработало! Спасибо! Кроме того, означает ли это, что мне не нужен мой конструктор? – Ares
Crap; вы правы в отношении свойства 'text'; Я думал о iOS 'UITextField'. Но на вашем «NSTextField» вы можете напрямую вызвать «doubleValue» и пропустить необходимость иметь дело со строкой вообще. – NRitH
Что конкретно вам нужно для подкласса 'NSTextField'? – NRitH