私は 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);
}
}
ありがとうございました!