0

私は Objective-C に比較的慣れていないので、コーディングしているすべてのことについて 100% ではありません。ただし、エラーが発生したときに対処していますが、修正方法がわからない実行時エラーが発生しています。このエラーは、「認識されないセレクターがインスタンスに送信されました」と主張しています。

- (IBAction) equalsPressed{
    self.userIsInTheMiddleOfTypingANumber = NO;
    if (self.brain.operationIsPicked) {
       [self.brain pushOperand: [self.display.text doubleValue]]; 
       double result = [self.brain performOperation: self.brain.operation];
       // The line below this 
       self.display.text = [NSString stringWithFormat: @"%g", result];
    }
}

私はスタンフォード大学の教授が教える電卓アプリをやっています。そのコースは iTunes U に投稿されています。ただし、enterPressed コマンドを含めないように編集し、代わりに変更された、よりユーザーフレンドリーな「equalsPressed」を使用しました。equalsPressed が終了した後 (電卓の等号をクリックしたとき)、エラーが表示されます。この問題の原因を知っている人はいますか?これと非常によく似たエラーが発生しているが、わずかに異なる場所で発生している他の人をすでに見つけました。問題の解明に役立つその他のコード スニペットを次に示します。

#import "CalculatorBrain.h"

@interface CalculatorBrain()
@property (nonatomic, strong) NSMutableArray *operandStack;
@end

@implementation CalculatorBrain

@synthesize operandStack = _operandStack;
@synthesize operandStackIsEmpty = _operandStackIsEmpty;
@synthesize operationIsPicked = _operationIsPicked;
@synthesize operation = _operation;

- (NSMutableArray *) operandStack {
    if (!_operandStack) {
        _operandStack =[[NSMutableArray alloc] init];
        _operandStackIsEmpty = YES;
        _operationIsPicked = NO;
    }
    return _operandStack;
}

- (void) resetStack {
    [self.operandStack removeAllObjects];
    self.operandStackIsEmpty = YES;
    self.operationIsPicked = NO;
}

- (void) pushOperand : (double) operand{
    [self.operandStack addObject: [NSNumber numberWithDouble:operand]];
    self.operandStackIsEmpty = NO;
}

- (double) popOperand {
    NSNumber *num = [self.operandStack lastObject];
    if (num) {[self.operandStack removeLastObject];}
    return [num doubleValue];
}

- (double) performOperation : (NSString *) operation{

    double result = 0;
    double num2 = [self popOperand];
    double num1 = [self popOperand];
    if ([operation isEqualToString:@"+"])
        result = num2 + num1;
    else if ([operation isEqualToString:@"-"])
        result = num2 - num1;
    else if ([operation isEqualToString:@"*"] || [operation isEqualToString:@"x"])
        result = num2 * num1;
    else if ([operation isEqualToString:@"/"]){
        if (num2 == 0)
            [self resetStack];
        else 
            result = num2 / num1;
    }

    [self pushOperand:result];
    self.operationIsPicked = NO;

    return result;

}

@end

また、コンソールに表示を出力したデバッグ NSLog は正しく動作しますが、電卓ビューの表示は実際には更新されません (関数を遅くするためにブレークポイントを使用した場合)。

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


@interface CalculatorViewController ()

@property (nonatomic) BOOL userIsInTheMiddleOfTypingANumber;
@property (nonatomic, strong) CalculatorBrain *brain;

@end


@implementation CalculatorViewController

@synthesize userIsInTheMiddleOfTypingANumber = _userIsInTheMiddleOfTypingANumber;
@synthesize brain = _brain;
@synthesize display = _display;

- (CalculatorBrain *) brain {

    if (!_brain) {
        _brain =[[CalculatorBrain alloc] init];
    }
    return _brain;

}

- (IBAction) digitPressed: (UIButton *)sender {

    NSString *digit = [sender currentTitle];
    if (self.userIsInTheMiddleOfTypingANumber)
        self.display.text = [self.display.text stringByAppendingString: digit];
    else {
        self.display.text = digit;
        self.userIsInTheMiddleOfTypingANumber = YES;
    }

}

- (IBAction) clearPressed {
    self.userIsInTheMiddleOfTypingANumber = NO;
    self.display.text = @"0";
    [self.brain resetStack];
}   


- (IBAction) equalsPressed {
    self.userIsInTheMiddleOfTypingANumber = NO;
    if (self.brain.operationIsPicked) {
        [self.brain pushOperand: [self.display.text doubleValue]]; 
        double result = [self.brain performOperation: self.brain.operation];
        self.display.text = [NSString stringWithFormat: @"%g", result];
        NSLog(@"%@",self.display.text);
    }
    NSLog(@"%@",self.display.text);
}

- (IBAction) operationPressed:(UIButton *) sender {

    if (self.userIsInTheMiddleOfTypingANumber) { 
        [self.brain pushOperand: [self.display.text doubleValue]]; 
        self.brain.operation = [sender currentTitle];
        self.brain.operationIsPicked = YES;
        self.userIsInTheMiddleOfTypingANumber = NO;
        NSLog(@"%@", sender.currentTitle);
    }
}

ありがとうございました!

4

1 に答える 1

1

コメントで答えを引用するには:

「完全なエラーは、「[self.brain equalsPressed:]」に無効な引数を送信したことを示しています。実際には、equalsPressed は引数を取りませんが、ビューの「=」ボタンをそれぞれのメソッドにリンクしていたときに、忘れていました関数が引数を取らないことを示すため. したがって、私が書いた関数には引数がありませんが、コンパイラに (最初に) 引数を取ることになっていると伝えました.

于 2014-10-09T14:15:45.857 に答える