我是 objective-c 的新手,我已经完成了为 iPhone 构建'tip计算器'应用的教程。我正在使用 Xcode 4.3.3 ,我检查了所有代码,它与教程中的相同(我确信它是正确的)。我一直在搜索网站,试图找到有同样问题的人,我无法修复它,所以我感谢任何帮助。这是我尝试运行应用程序时出现的消息。
2012-07-23 14:22:01.021 Tip_Calculator [554:f803] - [ViewController initWithCoder:]:无法识别的选择器发送到实例0x68a3130 2012-07-23 14:22:01.025 Tip_Calculator [554:f803] *终止应用 由于未捕获的异常'NSInvalidArgumentException',原因: ' - [ViewController initWithCoder:]:发送到的无法识别的选择器 实例0x68a3130' * 第一次抛出调用堆栈:(0x13c8022 0x1559cd6 0x13c9cbd 0x132eed0 0x132ecb2 0x234135 0x333c6e 0x333383 0x233cad 0x333c6e 0x33367b 0x333383 0x233105 0x43ceef 0x43d03e 0x11d7a 0x11ff8 0x1117f 0x20183 0x20c38 0x14634 0x12b2ef5 0x139c195 0x1300ff2 0x12ff8da 0x12fed84 0x12fec9b 0x10c65 0x12626 0x253d 0x24a5)终止调用throw 异常(LLDB)
这是 main.m 中标记的区域:
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char *argv[])
{
@autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); }
}
我检查了所有接口连接,它们没问题。我还添加了一个异常断点,这个错误出现了:
2012-07-23 20:49:53.633 Tip_Calculator [2067:f803] - [ViewController initWithCoder:]:无法识别的选择器发送到实例0x68c09c0 (LLDB)
这是显示的错误日志:
Tip_Calculator`start:
0x2470: pushl $0
0x2472: movl %esp, %ebp
0x2474: andl $-16, %esp
0x2477: subl $16, %esp
0x247a: movl 4(%ebp), %ebx
0x247d: movl %ebx, (%esp)
0x2480: leal 8(%ebp), %ecx
0x2483: movl %ecx, 4(%esp)
0x2487: addl $1, %ebx
0x248a: shll $2, %ebx
0x248d: addl %ecx, %ebx
0x248f: movl %ebx, 8(%esp)
0x2493: movl (%ebx), %eax
0x2495: addl $4, %ebx
0x2498: testl %eax, %eax
0x249a: jne 0x00002493 ; start + 35
0x249c: movl %ebx, 12(%esp)
0x24a0: calll 0x000024b0 ; main at main.m:14
**0x24a5: movl %eax, (%esp)**
0x24a8: calll 0x000033ca ; exit
0x24ad: hlt
0x24ae: nop
0x24af: nop
我在标记区域周围放了星号。无论是否存在异常断点,都会显示相同的错误。
我正在使用storyboard,这是 ViewController 的.h
文件:
#import <UIKit/UIKit.h>
@interface ViewController : NSObject
{
//outlets
IBOutlet UITextField *billField;
IBOutlet UITextField *tipFieldTen;
IBOutlet UITextField *tipFieldFifteen;
IBOutlet UITextField *tipFieldTwenty;
IBOutlet UITextField *tipFieldCustom;
IBOutlet UITextField *totalFieldTen;
IBOutlet UITextField *totalFieldFifteen;
IBOutlet UITextField *totalFieldTwenty;
IBOutlet UITextField *totalFieldCustom;
IBOutlet UILabel *customPercentLabel;
IBOutlet UISlider *customPercentSlider;
NSString *billTotal;
}
-(IBAction)calculateTip:(id)sender;
@end
这是 .m 文件:
#import "ViewController.h"
@implementation ViewController
- (void)awakeFromNib;
{
[billField becomeFirstResponder]; //display keyboard for billField
}
-(IBAction)calculateTip:(id)sender
{
static BOOL toggle = YES;
if (toggle)
{
toggle = NO;
NSString *billFieldText = billField.text;
float newTotal = [billFieldText floatValue];
float customTipPercent = customPercentSlider.value;
if(sender ==billField)
{
if (billFieldText.length <billTotal.length)
billTotal = [NSString stringWithFormat:@"%.02f",
newTotal / 10];
else
billTotal = [NSString stringWithFormat:@"%.02f",
newTotal * 10];
billField.text = billTotal;
newTotal = [billTotal floatValue];
float tenTip = newTotal * 0.10;
float fifteenTip = newTotal * 0.15;
float twentyTip = newTotal * 0.20;
tipFieldTen.text = [NSString stringWithFormat:@"%.02f", tenTip];
tipFieldFifteen.text = [NSString stringWithFormat:@"%.02f", fifteenTip];
tipFieldTwenty.text = [NSString stringWithFormat:@"%.02f", twentyTip];
totalFieldTen.text = [NSString stringWithFormat:@"%.02f", newTotal + tenTip];
totalFieldFifteen.text = [NSString stringWithFormat:@"%.02f", newTotal + fifteenTip];
totalFieldTwenty.text = [NSString stringWithFormat:@"%.02f", newTotal + twentyTip];
}
else if (sender == customPercentSlider)
{
int percentage = (int)(customTipPercent * 100);
customPercentLabel.text = [NSString stringWithFormat:@"%i%%", percentage];
float newSliderValue = ((float) percentage) / 100;
customPercentSlider.value = newSliderValue;
customTipPercent = newSliderValue;
}
float customTip = customTipPercent * newTotal;
tipFieldCustom.text = [NSString stringWithFormat:@"%.02f", customTip];
totalFieldCustom.text = [NSString stringWithFormat:@"%.02f", customTip + newTotal];
}
else
{
toggle = YES;
}
}
@end
任何帮助都会非常感激,因为我是 objective-c 的新手。
答案 0 :(得分:3)
你有
@interface ViewController : NSObject
这应该是:
@interface ViewController : UIViewController
<强>原因:强>
因此,您的ViewController
课程目前正在继承NSObject
,但未实施initWithCoder
。实际上,此方法调用是NSCoding
协议的一部分,UIViewController
采用。
<强>背景强>
您收到的错误基本上是说类ViewController
的对象被发送了一个选择器或'message',initWithCoder
,但它没有该方法的实现。因此,通常有两件事情可以跟踪它:
1)检查您是否在代码中的任何位置发送该消息,然后检查接收它的对象是否属于应该识别该方法的类。您还必须考虑从UIKit等框架调用该方法,这使得这更加困难。
2)如果上面看起来没问题,那么你必须考虑到,当你的代码假定一个对象是一种类型时,它实际上可能是另一种类型,因此会发生这种错误。
考虑以下代码:
NSArray *anArray = [[NSArray alloc] initWithObjects:@"aString", nil];
NSNumber *aNumber = [anArray objectAtIndex:0];
BOOL isEqual = [aNumber isEqualToNumber:[NSNumber numberWithInteger:42]];
这将在没有警告的情况下编译,但是当运行时会导致异常 - 因为它假定数组中的对象是NSNumber
,但实际上它是NSString
:
* 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSCFConstantString isEqualToNumber:]:无法识别的选择器发送到实例0x6cbfc'