1

私はobjective-cが初めてで、 iPhone用の「チップ計算機」アプリを作成するためのチュートリアルを実行しました。私は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 ] uncaught exception 'NSInvalidArgumentException', reason: '-[ViewController initWithCoder:]: unrecognized selector sent to instance 0x68a3130' * First throw call stack: (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) 例外をスローして終了します (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 

フラグが立てられた領域の周りにアスタリスクを置きました。例外ブレークポイントがあるかどうかに関係なく、同じエラーが表示されます。

私はストーリーボードを使用しています。ここに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が初めてなので、どんな助けでも大歓迎です。

4

1 に答える 1

3

あなたが持っている

@interface ViewController : NSObject

これはおそらく次のようになります。

@interface ViewController : UIViewController

理由:

したがって、ViewControllerクラスは現在NSObject、実装していないから継承していますinitWithCoder。実際、このメソッド呼び出しは、採用するNSCodingプロトコルの一部です。UIViewController

バックグラウンド:

あなたが受け取ったエラーは、基本的に、クラスのオブジェクトにViewControllerセレクターまたは「メッセージ」が送信されたinitWithCoderが、そのメソッドの実装がなかったことを示しています。したがって、これを追跡するために一般的に行うことが 2 つあります。

1) コード内のどこかにそのメッセージを送信しているかどうかを確認し、それを受信するオブジェクトがそのメソッドを認識できるクラスであるかどうかを確認します。また、そのメソッドが UIKit などのフレームワークから呼び出されることを考慮する必要があるため、これが少し難しくなります。

2) 上記が問題ないように見える場合、コードではオブジェクトが 1 つのタイプであると想定されているが、実際には別のタイプである可能性があるため、このエラーが発生する可能性があることを考慮する必要があります。

次のコードを検討してください。

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 に送信されました'

于 2012-07-23T20:20:26.327 に答える