2

ユーザー インターフェイスを xib ファイルに設定すると、すべてがうまく機能するようになりました。しかし、xib ファイルはかなり雑然としていたので、ボタンやバーなどをいくつか作成してみることにしました。代わりにプログラムで。それらを正常に表示させることはできますが、セレクターに何か問題があります。

instructionsたとえば、xib ファイルのボタンでは、マウスを使用してボタンinstructionsgiveInstructions.h ファイルのメソッドに接続しただけで、すべて問題ありませんでした。しかし、プログラムで試してみると、次のようになります。

UIBarButtonItem *instr = [[UIBarButtonItem alloc] initWithTitle:@"Instructions" 
                                                          style:UIBarButtonSystemItemDone target:nil action:@selector(giveInstructions:)];

unrecognized selector sent to instanceエラーが発生します。私は何を間違っていますか?

4

4 に答える 4

2

ターゲットの問題を修正したので、少なくともこのクラスの実装には「giveInstructions」が存在しない可能性が最も高いです。

宣言した場合

- (void)giveInstructions:(id)sender;

.h では、.m ファイルに一致する実装が必要です。たとえば、次のようになります。

- (void)giveInstructions:(id)sender{
    //my code here
}

すでにこれを行っている場合、私が考えることができる唯一の間違いは@selector(giveInstructions:)、送信者がない場合、またはメソッドから渡された他の引数がない場合、コロンが不要になる可能性があることです。

注:呼び出し@selectorているメソッドが実際に宣言された名前と 1 文字異なる場合に呼び出すと、セレクターが存在しないため、このエラーが発生します。

于 2012-08-11T20:45:31.103 に答える
2

あなたtargetはそうあるべきnilではなく、アクションを受け取るべきインスタンスです。それはおそらくselfあなたの場合なので、これを試してください:

UIBarButtonItem *instr = [[UIBarButtonItem alloc] initWithTitle:@"Instructions" style:UIBarButtonSystemItemDone target:self action:@selector(giveInstructions:)];
于 2012-08-11T20:37:20.773 に答える
2

セレクターの命名は重要です。

コロンが 1 つある場合は、引数を 1 つ取るメソッドを参照します。

@selector(myMethod:)

- (void)myMethod:(id)sender;

コロンがない場合、メソッドは引数を想定していません

@selector(myMethod)

- (void)myMethod;

どちらも同じ名前のように見えますが、実際には 2 つの異なるメソッドです。

于 2012-08-11T20:52:17.683 に答える
1
UIBarButtonItem *instr = 
[[UIBarButtonItem alloc] initWithTitle:@"Instructions" 
style:UIBarButtonSystemItemDone target:self action:@selector(giveInstructions:)];
<-- change "nil" to "self" !

target:nilself、これらの関数がこのクラス ファイルに属しているためです。

于 2012-08-11T20:41:24.497 に答える