-1

電卓アプリを作成しようとしていますが、Enterキーを押すと、配列に何もプッシュされません。CaculatorBrainメソッドが定義されている場所というクラスがありますpushElementが、(今のところ)ViewControllerでメソッドを定義して実装pushElementしました。

Enterキーが押されたときにコンソールに入力されたオペランドオブジェクトをログに記録すると、配列の内容はnilになります。何故ですか?

#import "CalculatorViewController.h"
#import "CalculatorBrain.h"

@interface CalculatorViewController ()
@property (nonatomic)BOOL userIntheMiddleOfEnteringText;
@property(nonatomic,copy) NSMutableArray* operandStack;


@end

@implementation CalculatorViewController

BOOL userIntheMiddleOfEnteringText;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}


-(NSMutableArray*) operandStack {
    if (_operandStack==nil) {
        _operandStack=[[NSMutableArray alloc]init];
    }
    return _operandStack;


}



-(CalculatorBrain*)Brain
{
   if (!_Brain) _Brain=  [[CalculatorBrain alloc]init];
    return _Brain;
}



- (IBAction)digitPressed:(UIButton*)sender {
    if (self.userIntheMiddleOfEnteringText) {
    NSString *digit= [sender currentTitle];
    NSString *currentDisplayText=self.display.text;
    NSString *newDisplayText= [currentDisplayText stringByAppendingString:digit];
    self.display.text=newDisplayText;
     NSLog(@"IAm in digitPressed method");
}
    else
    {
        NSString *digit=[sender currentTitle];
        self.display.text = digit;
       self. userIntheMiddleOfEnteringText=YES;
    }
}


-(void)pushElement:(double)operand {
    NSNumber *operandObject=[NSNumber numberWithDouble:operand];
    [_operandStack addObject:operandObject];
    NSLog(@"operandObject is %@",operandObject);
    NSLog(@"array contents is %@",_operandStack);

}


- (IBAction)enterPressed {

[self  pushElement: [self.display.text doubleValue] ];

NSLog(@"the contents of array is %@",_operandStack);

        userIntheMiddleOfEnteringText= NO;

}
4

1 に答える 1

0

オペランドスタックが初期化されていないようです。

直接アクセスする場合、オペランドスタックが割り当てられて初期化される唯一の場所であるを_operandStack通過しません。-(NSMutableArray*) operandStack配列が割り当てられていない場合、配列に何も入れることができません。そのため、配列は内容をnilとしてログに記録します。

メソッド内を除くすべての場所で(がnilself.operandStackであるかどうかをチェックするメソッドを使用する)いずれかを使用するか、オペランドスタックをに割り当てることをお勧めします。_operandStack-(NSMutableArray*) operandStackviewDidLoad

于 2013-03-05T18:38:55.997 に答える