1

我正在制作一个简单的计算器,当我使用加法按钮时,iOS 模拟器崩溃并且我得到一个 NSInvalidArgumentException。我该怎么做才能防止这种情况发生?错误报告:

2013-06-23 17:18:54.574 Tutorial Test (Storyboard)[9744:c07] -[ViewController2 addition]:     
unrecognized selector sent to instance 0x75858f0
2013-06-23 17:18:54.577 Tutorial Test (Storyboard)[9744:c07] *** Terminating app due to 
uncaught exception 'NSInvalidArgumentException', reason: '-[ViewController2 addition]: 
unrecognized selector sent to instance 0x75858f0'
*** First throw call stack:
(0x1c91012 0x10cee7e 0x1d1c4bd 0x1c80bbc 0x1c8094e 0x10e2705 0x162c0 0x16258 0xd7021     
0xd757f 0xd66e8 0x45cef 0x45f02 0x23d4a 0x15698 0x1becdf9 0x1becad0 0x1c06bf5 0x1c06962 
0x1c37bb6 0x1c36f44 0x1c36e1b 0x1beb7e3 0x1beb668 0x12ffc 0x1e2d 0x1d55)
libc++abi.dylib: terminate called throwing an exception
(lldb)

ViewController 中出现此错误的代码:

查看控制器.h

#import <UIKit/UIKit.h>
//Calculator
@interface ViewController2 : UIViewController{

IBOutlet UITextField *textField1;
IBOutlet UITextField *textField2;
IBOutlet UILabel *label;
}

-(IBAction)addition;
-(IBAction)subtract;
-(IBAction)multiply;
-(IBAction)divide;
-(IBAction)clear;

@end

查看控制器.m

//Addition
-(IBAction)plus
{
float a = ([textField1.text floatValue]);
float b = a+([textField2.text floatValue]);
label.text = [[NSString alloc] initWithFormat:@"%2.f", b];
}
4

4 回答 4

2

.m您在文件中命名了方法plus,而不是addition. 这就是addition找不到该方法的原因,解决方法是将.m文件中的方法从重命名plusaddition

//Addition
-(IBAction)addition
{
    float a = [textField1.text floatValue];
    float b = [textField2.text floatValue];
    label.text = [[NSString alloc] initWithFormat:@"%2.f", a+b];
}
于 2013-06-23T22:32:30.673 回答
0

您没有实施正确的方法。

你打电话addition,但你从​​来没有真正实现它。在 .h 中声明方法签名是不够的,您必须对方法进行编码。

于 2013-06-23T22:32:26.740 回答
0

您是否分配了ViewController2该类的实例?

例如:

ViewController2 *vc2 = [[ViewController2 alloc] init];
[vc2 addition];

此外,如果您发布的 .m 代码是该文件的全部内容,那么您也将丢失

-(IBAction)addition {
    ...
}
于 2013-06-23T22:33:03.717 回答
-1

这意味着您调用的选择器在您调用它的类上不可用。最好的办法是在方法被调用的地方放置一个断点。转到调试器并 po 你的对象。

po 0x75858f0 

在这种情况下。但是,该数字可能是一个对象,并且可能不同。查看控制台中的数字。

确保对象属于正确的类。然后检查该类以确保它响应您正在调用的选择器。

编辑:你的问题是你的加法应该重命名为加法。.h 中的名称必须与 .m 中的名称匹配

于 2013-06-23T22:31:57.283 回答