2013-05-17 8 views
0

Я построил это приложение калькулятора в xcode 4.5, цифры работают так, как ожидалось, но операции ie (+, -, c) работали один раз и никогда, поскольку они возвращают только Nan и inf, а кнопка ввода всегда сбой приложения и возвращает ошибку below.I встроенный интерфейс в раскадровке и связанных кнопок с соответствующими методамиОшибка при сбое SIGARBT

@autoreleasepool { 
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([CalculatorAppDelegate  
class])); 

Это мой CalculatorViewController.h

#import <UIKit/UIKit.h> 

@interface CalculatorViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UILabel *display; 

@end 

Это мой CalculatorViewController.m

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

@interface CalculatorViewController() 
@property(nonatomic) BOOL userIsInTheMidleOfEnteringANumber; 
@property (nonatomic, strong)CalculatorBrain *brain; 
@end 

@implementation CalculatorViewController 

@synthesize display = _display; 
@synthesize userIsInTheMidleOfEnteringANumber =_userIsInTheMidleOfEnteringANumber; 
@synthesize brain = _brain; 

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

- (IBAction)digitPressed:(UIButton *)sender 
{ 
    NSString *digit = sender.currentTitle; 
    if (self.userIsInTheMidleOfEnteringANumber){ 
    self.display.text = [self.display.text stringByAppendingString:digit]; 
} 
    else { 
     self.display.text = digit; 
     self.userIsInTheMidleOfEnteringANumber=YES; 
    } 
} 
- (IBAction)enterPressed 
{ 
    NSLog(@"im hre"); 
    [self.brain pushOperand:[self.display.text doubleValue]]; 
    self.userIsInTheMidleOfEnteringANumber=NO; 
} 
- (IBAction)operationPresed:(UIButton *)sender 
{ 
    if (self.userIsInTheMidleOfEnteringANumber) [self enterPressed]; 
    double result =[self.brain performOperation:sender.currentTitle]; 
    NSString *resultString= [NSString stringWithFormat:@"%g",result]; 
    self.display.text= resultString; 
} 
    @end 

Это мой CalculatorBrain.h

#import <Foundation/Foundation.h> 

@interface CalculatorBrain : NSObject 
-(void)pushOperand:(double)operand; 
-(double)performOperation:(NSString *)operation; 

@end 

Это мой CalculatorBrain.m

#import "CalculatorBrain.h" 
@interface CalculatorBrain() 
@property (nonatomic,strong)NSMutableArray *operandStack; 
@end 

@implementation CalculatorBrain 
@synthesize operandStack = _operandStack; 

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

-(void)pushOperand:(double)operand 
{ 

    [self.operandStack addObject:[NSNumber numberWithDouble:operand]]; 
} 
-(double)popOperand 
{ 
    NSNumber *operandObject = [self.operandStack lastObject]; 
    if (operandObject) [self.operandStack removeLastObject]; 
    return [operandObject doubleValue]; 
} 

-(double)performOperation:(NSString *)operation 
{ 
    double result=0; 
    //calculate result 
    if ([operation isEqualToString:@"+"]) 
    { 
     result =[self popOperand]+ [self popOperand]; 
    } 
    else if ([operation isEqualToString:@"*"]) 
    { 
    result = [self popOperand] * [self popOperand]; 
    } 
    else if ([operation isEqualToString:@"-"]) { 
     result = [self popOperand] - [self popOperand]; 
    } 
    else if ([operation isEqualToString:@"/"]) { 
     result = [self popOperand]/[self popOperand]; 
    } 
    [self pushOperand:result]; 

    return result; 
} 

@end

Im работая из примера и выполнили все шаги, я не понимаю, то, что я делаю неправильно, метод enterPressed не имеет типа ie UIButton. Это мой консольный вывод

2013-05-17 15:05:15.221 Calculator[786:11303] im hre 
2013-05-17 15:05:15.280 Calculator[786:11303] -[CalculatorViewController enterPressed:]: unrecognized selector sent to instance 0x922a620 
2013-05-17 15:05:15.288 Calculator[786:11303] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CalculatorViewController enterPressed:]: unrecognized selector sent to instance 0x922a620' 
*** First throw call stack: 
(0x1c8e012 0x10cbe7e 0x1d194bd 0x1c7dbbc 0x1c7d94e 0x10df705 0x16920 0x168b8 0xd7671 0xd7bcf 0xd6d38 0x4633f 0x46552 0x243aa 0x15cf8 0x1be9df9 0x1be9ad0 0x1c03bf5 0x1c03962 0x1c34bb6 0x1c33f44 0x1c33e1b 0x1be87e3 0x1be8668 0x1365c 0x1f0d 0x1e35) 
libc++abi.dylib: terminate called throwing an exception 
(lldb) 

любая помощь будет оценена б

ответ

1

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CalculatorViewController enterPressed:]: unrecognized selector sent to instance 0x922a620' ответ здесь. Проверьте, есть ли у вас метод enterPressed: в вашем классе CalculatorViewController. Я уверен, что это как-то неправильно, если не хватает

1

Изменить метод подписи:

- (IBAction)enterPressed 

в

- (IBAction)enterPressed:(id)sender 
0

В вашем CalculatorViewController.m файл заменить

- (IBAction)enterPressed 

t o

- (IBAction)enterPressed:(UIButton *)sender 
0

У меня была эта точно такая же проблема на самом деле ... Я удалил кнопку Enter и воссоздал ее, а затем после нее работал. Удачи, я хотел вытащить свои волосы

0

Существует много рабочих ответов ниже. Причина, по которой вы столкнулись с этой проблемой, заключается в том, что метод, который вы связали в вашем файле xib с одной из ваших кнопок, отображается на xib, указывает на enterPressed: - метод с аргументом (enterPressed, за которым следует двоеточие), но у вас есть закодировал метод без аргумента (enterPressed), поэтому он приводит к сбою.Код пытался найти метод с аргументом, который вы связаны в файле XIb, но не нашел его, приводит к сбою говоря - «непризнанный селектор послал к экземпляру»

Поэтому просто заменить

- (IBAction)enterPressed 

с этим:

- (IBAction)enterPressed:(UIButton *)sender 
Смежные вопросы