web-dev-qa-db-ja.com

Objective-Cでの "認識できないセレクタがインスタンスに送信しました"エラー

ボタンを作成してアクションを追加しましたが、ボタンが呼び出されるとすぐに次のエラーが発生しました。

-[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance
 0x3d03ac0 2010-03-16 22:23:58.811
 Money[8056:207] *** Terminating app
 due to uncaught exception
 'NSInvalidArgumentException', reason:'*** -[NSCFDictionary numberButtonClick:]:  unrecognized selector sent to instance 0x3d03ac0'

これは私のコードです:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        UIButton *numberButton = [UIButton buttonWithType:UIButtonTypeCustom];        
        numberButton.frame = CGRectMake(10, 435, 46, 38);
        [numberButton setImage:[UIImage imageNamed:@"one.png"] forState:UIControlStateNormal];
        [numberButton addTarget:self action:@selector(numberButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview: numberButton]; 
    }
return self;
}

-(IBAction)numberButtonClick:(id)sender{
    NSLog(@"---");
}
144
HelloWorld

View Controllerを適切に管理しているメモリではなく、ある時点で割り当て解除されているようです。これにより、numberButtonClicked:メソッドは、View Controllerが以前に占有していたメモリを占有している別のオブジェクトに送信されます。

View Controllerを正しく保持または解放していることを確認してください。

176
Jasarien

私がやったようにグーグル経由でここに来た人たちにとっては、おそらくXcode 4.2以上/ iOS 5+以上に関係している。私は同じエラー "インスタンスに送られた認識されないセレクタ"を持っていました。私の場合、UIButtonのターゲットアクションを送信者パラメータとして渡すように設定しましたが、後でそれが必要ないことに気付き、コードから削除しました。だから、のようなもの:

- (IBAction)buttonPressed:(UIButton *)sender {

に変更されました:

- (IBAction)buttonPressed {

問題のUIButtonを右クリックすると、Touch Up InsideイベントがView ControllerのbuttonPressed:メソッドに関連付けられていることがわかりました。これを削除して変更されたメソッドに再割り当てすると、問題が解決しました。

124
LeonardChallis

これがこの問題に対するグーグルのトップの答えでしたが、私は別の原因/結果を持っていました - 私は他の人がこの問題に出くわした場合のために私の2セントを加えたいと思いました。

私は今朝同様の問題を抱えていました。あなたがあなたにあなたにあなたに問題を与えているUI項目を右クリックさせるならば、あなたはどんな接続が作成されたか見ることができることがわかりました。私の場合、私はボタンを2つのアクションに配線しました。右クリックメニューからアクションを削除してそれらを再接続したところ、問題は解決しました。

だからあなたの行動が正しく配線されていることを確認してください。

68
Chris K

はい、ここでチップインしなければなりません。 OP 動的にボタンを作成した。私は同じような問題を抱えていて、答え(狩猟の数時間後)はとても単純なので、私は病気になりました。

使用する場合

action:@selector(xxxButtonClick:)

or (as in my case)

action:NSSelectorFromString([[NSString alloc] initWithFormat:@"%@BtnTui:", name.lowercaseString])

あなたがコロンを文字列の末尾に置くならば - それは送り主を通過するでしょう。コロンを文字列の末尾に配置しないと、コロンは配置されず、コロンが必要な場合は受信側でエラーが発生します。イベント名を動的に作成している場合は、コロンを見逃しやすいです。

受信機コードのオプションは次のようになります。

- (void)doneBtnTui:(id)sender {
  NSLog(@"Done Button - with sender");
}
 or
- (void)doneBtnTui {
  NSLog(@"Done Button - no sender");
}

いつものように、それは常に見逃される明白な答えです。

24
Craig H.

私の場合、関数は引数を期待していませんでしたが、ボタンはエラーの原因となる引数を送信するように設定されていました。これを修正するために、私はイベントハンドラを再配線しなければなりませんでした。

これが私の機能です:

enter image description here

引数が含まれていないことに注意してください。

これが私のボタン設定のイメージです(ボタンを右クリックして表示します)。

enter image description here

3つのイベントハンドラがあります。

この問題を解決するには、各イベント項目をenterPressed関数への参照として自分自身に送信していたため、各イベント項目を削除する必要がありました。これらのアイテムを削除するには、アイテムが表示されなくなるまで、各アイテムの名前の横にある小さなxアイコンをクリックしました。

enter image description here

次にボタンをイベントに再接続しなければなりませんでした。これを行うには、Ctrlキーを押しながらボタンからアクションまで線をドラッグします。 「Connect Action」と表示されるはずです。注:何らかの理由でこれを機能させるには、XCodeを再起動する必要がありました。それ以外の場合は、関数の上または下にアクション(新しいアクションを作成)を挿入するだけです。

enter image description here

引数を渡さないbuttonイベントに接続された単一のイベントハンドラがあります。

enter image description here

この答えは、@ Leonard Challisによる答えを補完するもので、あなたも読むべきです。

22
1.21 gigawatts

これは、インターフェースビルダーでビューの「クラス」を設定していない場合にも発生する可能性があります。

14
user1658373

私の場合は、NSNotificationCenterを使用していて、引数をとらないセレクタを使用しようとしていましたが、コロンを追加していました。コロンを取り除くことで問題は解決しました。

セレクタ名を使用するとき、引数がない場合は末尾のコロンを使用しないでください。引数が1つある場合は、末尾にコロンを1つ使用します。複数の引数がある場合は、各引数の末尾にコロンを付けて名前を付ける必要があります。

ここにアダムローゼンフィールドの答えを見なさい: 目的Cのセレクター

12

私は動的にボタンを作成しているSwiftプロジェクトでこの問題を抱えていました。問題コード:

var trashBarButtonItem: UIBarButtonItem {
    return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked")
}

func newButtonClicked(barButtonItem: UIBarButtonItem) {
    NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
}

解決策は、アクションの後にコロン「:」を追加することでした。

var trashBarButtonItem: UIBarButtonItem {
        return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked:")
    }

    func newButtonClicked(barButtonItem: UIBarButtonItem) {
        NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
    }

ここに完全な例: https://developer.Apple.com/library/content/samplecode/UICatalog/Listings/Swift_UIKitCatalog_DefaultToolbarViewController_Swift.html

11
FredL

これの最も明白な原因(完全性のために含まれています)は、不適切にポインターをキャストして、間違ったクラスのメソッドを呼び出すことです。

NSArray* array = [[NSArray alloc] init];
[(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception
5
devios1

同じエラーが発生し、次のことがわかりました。

コードを使うとき

[self.refreshControl addTarget:self action:@selector(yourRefreshMethod:) forControlEvents:UIControlEventValueChanged];

あなたはそれがセレクタを探していると思うかもしれません:

- (void)yourRefreshMethod{
    (your code here)
}

しかし、実際にはセレクターを探しています。

- (void)yourRefreshMethod:(id)sender{
    (your code here)
}

そのセレクタは存在しないので、クラッシュするでしょう。

エラーを解決するために受信側(id)送信側にセレクタを変更できます。

しかし、あなたが他の関数がリフレッシュ関数を呼び出さずに送り手を提供していたらどうしますか?あなたは両方のために働く一つの機能が必要です。簡単な解決策は別の機能を追加することです。

- (void)yourRefreshMethodWithSender:(id)sender{
    [self yourRefreshMethod];
}

そして、代わりにそのセレクタを呼び出すように更新プルダウンコードを修正します。

[self.refreshControl addTarget:self action:@selector(yourRefreshMethodWithSender:) forControlEvents:UIControlEventValueChanged];

私はまた、Mac OSXの最新バージョンにアップグレードすることができない古いMacでStanford iOSコースをやっています。だから私はまだiOS 6.1用に構築していて、これで問題は解決した。

3
Joseph Pride

私も同じ問題を抱えていました。

私は自分の絵コンテから自分のuibuttonを削除して作り直しました。

3
Yohan Dahmani

私は同じような問題を抱えていました、しかし私にとって解決策は少し異なっていました。私の場合は、カテゴリを使用して既存のクラスを拡張し(サイズ変更機能についてはUIImage - 興味がある場合はこちら howto を参照)、ビルドターゲットに* .mファイルを追加するのを忘れました。 。愚かなエラーですが、どこを見ればよいのかはっきりしません。私はそれが共有する価値があると思いました...

3
Mirko Jahn

戻り型のIBActionの代わりにvoidを使用する必要があると思います。プログラムでボタンを定義したからです。

2
Fa.Shapouri

これは私のUIViewcontrollerクラスのコード内の "@IBAction func ..."を誤って消去したために起こりました。ストーリーボードではReference Outletが作成されましたが、実行時にそれを処理する関数がありました。

解決策は、プロパティインスペクタ内のOutlet参照を削除してから、コマンドキーでクラスコードにドラッグして再作成することでした。

それが役に立てば幸い!

2
Guillermo

私は同じ問題を抱えていました。私にとっての問題は、1つのボタンに2つのActionメソッドがあることです。ボタンの最初のアクションメソッドを作成し、それをView Controllerで削除しましたが、接続インスペクタのメインストーリーボードで接続を切断するのを忘れていました。そのため、2番目のアクションメソッドを追加したときに、1つのボタンに対して2つのアクションメソッドがあり、それがエラーの原因となっていました。

1
Harshil.Chokshi

さらに別の解決策/ケース。

私はXamarinとMvvmCrossを使っていて、UIButtonをViewModelにバインドしようとしていました。 UIButtonをOutletとTouchUpInsideに接続しました。

バインドするときは、アウトレットだけを使います。

set.Bind (somethingOutlet).For ("TouchUpInside").To(vm => vm.Something);

XCodeのaction(TouchUpInside)接続を削除するだけで解決しました。

P.Sこれは基本的にすべて前の回答、特に@Chris Kaminskiに関連していると思いますが、これが誰かに役立つことを願っています...

乾杯。

1
YKa

..そして今私の

ボタンを別のボタンのパラメータにアクセスするメソッドにリンクさせましたが、ボタン自体で何かをやろうとするとすぐにうまくいきましたが、クラッシュしました。コンパイル中にエラーは表示されませんでした。

ボタンをファイルの所有者にリンクできませんでした。だからここにいる誰かが私と同じくらいばかなのであれば、これを試してみてください:)

1
user2875404

私の場合は、UIWebViewを使用していて、NSURLの代わりに2番目のパラメータにNSStringを渡しました。そのため、関数に誤ったクラス型が渡されると、このエラーが発生する可能性があります。

1
jbaylina

私は現在iOSの開発を学び、aPressによる "Beginning iOS6 Development"の本を読み進めています。第10章ストーリーボードでも同じエラーが出ました。

それを理解するのに2日かかりましたが、持ってはいけないときに誤ってTableViewセルのタグを1に設定しました。この本を読んでいて同様のエラーを受け取った人にとっては、これが役に立つことを願っています。

私は私のコードの将来のエラーが見つけやすいと本当に願っています!ハハハ。デバッグエラーはそれを理解するために正しい方向に私を推し進めるために何もしませんでした(または少なくともデバッガを理解するにはあまりにも新しすぎる、笑).

1
Shannon Cole

私の場合、私は2時間後に問題を解決しました:

送信者(tabBar項目)参照元アウトレットがありませんでした。それで、それはどこも指していませんでした。

Juste 参照アウトレットを作成するあなたの機能に対応します。

これが皆さんに役立つことを願っています。

1
André DS

私にとっては、それはinterfacebuilder bij ctrl-draggingで作成された残りの接続でした。切断された接続の名前はエラーログにありました

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[NameOfYourApp.NameOfYourClass nameOfCorruptConnection:]:
unrecognized selector sent to instance 0x7f97a48bb000'

ボタンにリンクしたアクションがありました。アウトレットはもう私のコードには存在しないため、ボタンを押すとアプリがクラッシュしました。ログで名前を検索すると、ストーリーボードに表示されます。それを削除し、そしてクラッシュは消えました!

1
Tom Brinkkemper

これのもう一つの本当に愚かな原因はセレクターがインターフェース(.h)で定義されているがインプリメンテーション(.m)で定義されていないことです(p.e. typo)。

0
jla

ユーザー「oli206」と同じようにスタンフォードiOSクラスC193Pも受けていたので、私はLeonard Challisに返信しています。

"キャッチされていない例外 'NSInvalidArgumentException'が原因でアプリを終了しています、理由:"

問題は、電卓の「Enter」ボタンが2回接続されていたことです。ストーリーボードのボタンを調べたところ、右クリックしたときに「Touch Up Inside」属性に2つのエントリがあることがわかりました。 「Enter」ボタン2つのうちの1つを削除すると、「内部へのタッチアップ」「送信済みイベント」という問題が解決しました。

これは、2つのイベントがイベントを送信したときに問題が発生したことを示しています(割り当て1の電卓ウォークスルーのC193Pビデオクラス)。その1つが例外を引き起こしていました。

0
Peter_from_NYC

Swift 2からSwift 3に切り替えた後にこれが発生しました。以下の説明は具体的ですが、一般的なケースでは多くのエラーが発生する可能性があります。

deleteのサブクラスにSKNodeというメソッドがありました。

func delete(thing: SomeType) 

deleteには既にUIResponderというメソッドがありますが、私のメソッドは(意図せずに)それをオーバーロードしていたので、うまく機能していました。 Swift 3にアップグレードすると以下のように変更されました。

func delete(_ thing: SomeType) 

まだ働いています。しかし、それから私はそれをSwift3ifyすることにし、パラメータを必須にしました:

func delete(thing: SomeType)

呼び出し元を更新したことを覚えていれば問題なく動作しますが、呼び出し元がdelete内のno-parameter-name UIResponderメソッドを間違ったタイプの引数で呼び出しています。

これは明らかにSKNode(そしておそらくUIView)上の標準メソッドの長いリストのどれかが引数としてAnyを取るときに起こることがあり、コンパイルフェーズを通過しますが、呼び出されるとフォールオーバーします。

0
rghome

私の場合は:viewの中のcollectionView

私が自分で書いたconfig()メソッドにgestureRecognizerを追加しようとしていました。いくつかの回避策の後、私はコードをawakeFromNib()内に移動するだけでよいことがわかりました。

override func awakeFromNib() {

   //other code

   let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongGesture(gesture:)))
   self.collectionView.addGestureRecognizer(longPressGesture)
}

そしてそれはうまくいった。

これが誰かに役立つことを願っています。

0
Federico Arvat

リストに追加するもう1つの理由/解決策。これはiOS6.0(および/または悪いプログラミング)が原因です。古いバージョンではパラメータタイプが一致すればセレクタは一致しましたが、iOS 6.0ではパラメータの名前が正しくなかった以前に動作していたコードでクラッシュしました。

私は何かをしていた

[objectName methodName:@"somestring" lat:latValue lng:lngValue];

しかし、定義(.hと.mの両方)には

(viod) methodName:(NSString *) latitude:(double)latitude longitude:(double)longitude;

これはiOS 5ではうまくいきましたが6ではうまくいきませんでした。まったく同じビルドでさえも異なるデバイスに展開されました。

とにかく、コンパイラがこれを教えてくれない理由がわからない - 問題が深刻化した。

0
Tim T

私の問題と解決策は異なっていました、そして将来の読者が壁にぶつかることから彼らの頭を救うことができるように私はそれをここに投稿するべきだと思いました。

私は同じUIVIewControllerに異なるxibを割り当てていました、そしてどこでも検索した後でさえ私はそれを修正する方法を見つけることができませんでした。それから、initWithNibNameを呼び出しているAppDelegateをチェックし、コードのコピー中にxib名を変更したのにUIViewControllerクラスを変更するのを忘れていました。そのため、どの方法でもうまくいかない場合は、initWithNibNameメソッドを確認してください。

0
noob

私の分け前を含みます。 ARC(自動カウント参照) 無効にしてプロジェクトを作成したことに気付くまで、私はしばらくこれにとどまりました。そのオプションをYESにするだけで問題は解決しました。

0
caiocpricci2

InterfaceBuilderでViewControllerをViewControllerSceneに割り当てないと発生する可能性があります。そのため、ViewController.mはどのシーンにも接続されていません。

0
Vincent

私の場合:

私のプロトコル定義

 @protocol MyProtocol

- (void)Method;

@end

そして、私はデリゲートメソッドを実装するのを忘れました。

誰かに役立つことを願っています。

0
liu jeff

私はSwiftでいくつかの古いフォーマットコードを試すことでこの問題を得ました、

let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(self.respond))

action:"respond:"をaction:#selector(self.respond)に変更することで問題は解決しました。

0
sabithpocker

これは、ControllerAからカスタムControllerBクラス内のパブリックプロパティにプロパティを設定し、ストーリーボードのIDインスペクタ内にまだ「カスタムクラス」を設定していない場合にも発生する可能性があります。

基本:動的呼び出し

Objective Cは、クラス内のメソッドの実行時間を調べることによってメソッドを呼び出す動的言語です。たとえば、Class Aメソッドを含むDoSomething(arg1、arg2)があるとします。 Class Aのオブジェクトに対して正しい引数を使ってメソッドを呼び出そうとすると、すべてうまくいきます。ただし、引数が正しく渡されない場合、たとえば、引数を1つだけ指定してメソッドを呼び出した場合、ランタイムはこれを別のメソッドのメソッド呼び出しとして扱います。最終的に、ランタイムはメソッド(1つの引数を持つDoSomething)を見つけることができず、この例外を通して"認識されないセレクタがインスタンスに送信しました"

溶液

@ selectorに対応するsignatureが正しいことを確認してください。通常は、コードで説明したとおりです。

-(IBAction)numberButtonClick:(id)sender{
0
hadaytullah

別の可能な解決策:リンカ引数に '-ObjC'を追加してください。

詳しい説明はこちら: 静的ライブラリのObjective-Cカテゴリ

その要旨は、カテゴリが静的にリンクしているライブラリで定義されている場合、カテゴリメソッドでリンクするのに十分なほどスマートではないということです。上記のフラグにより​​、リンカリンクはすべてのObjective Cクラスおよびカテゴリにリンクされます。単なるものでは、ソースの分析に基づいて必要となるとは限りません。 (その答えを調整したり修正したりしてください。私はリンクされた言語を知っていたので、ここではただオウムです。).

0
Russ Egan

矛盾する制約引数のせいで私には思われた。

0
Alex Bedro

私もcontroller'sUIをストーリーボードに組み込みましたが、controller'sUIはその制御をコードに関連付けていませんでした。このコードを使ってvcを初期化しました。

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Me" bundle:nil];
    [sb instantiateViewControllerWithIdentifier:@"HeaderViewController"];

上記のコードで問題が発生し、initのコードを以下のように変更した後、問題を解決しました。

HeaderViewController *head_vc = [[HeaderViewController alloc] init];
0
aircraft