Objective-C での「認識されないセレクターがインスタンスに送信されました」エラー
-
20-09-2019 - |
質問
ボタンを作成し、そのアクションを追加しましたが、呼び出すとすぐに次のエラーが発生しました。
-[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(@"---");
}
解決
それはあなたがメモリを適切ビューコントローラを管理していないように見え、それがどこかの時点で割り当てが解除されている - numberButtonClicked:
方法は、現在のビューコントローラが以前に占有されていたメモリを占有している別のオブジェクトに送信されます。 ..
あなたが適切にあなたのビューコントローラを解放/保持していることを確認します。
他のヒント
ARCと、おそらくXcodeの4.2 + /のiOS 5+以上に多くの属する私が行ったようにグーグル経由でここになったもの、何のために。私は、「のインスタンスに送信されたを認識できないセレクタ」同じエラーが発生しました。私の場合は、送信者のパラメータとしての地位を渡すために設定UIButtonのターゲットアクションを持っていたが、後に、私はコードであること、それを必要とし、除去されていないことに気付きました。だから、何かます:
- (IBAction)buttonPressed:(UIButton *)sender {
に変更されました。
- (IBAction)buttonPressed {
方法:問題のUIButtonをクリックすると右のタッチアップインサイドイベントがのbuttonPressedビューコントローラと関連していることを示しました。御馳走を働いたこれを削除し、修正された方法にそれを再割り当てます。
このは、この問題のために、トップのGoogleの答えでしたが、私は別の原因/結果を持っていた - 私は他の人がこの問題に遭遇する場合には、私は私の2セントを追加しようと思いました。
私は今朝、同様の問題がありました。私はあなたが右のあなたに問題を与えるUIの項目をクリックすると、あなたは接続が作成されたものを見ることができることを見出しました。私の場合、私は2つのアクションまでの有線ボタンを持っていました。私は、右クリックメニューからアクションを削除し、それらを再配線し、私の問題を修正しました。
ですから、アクションはすぐに配線されていることを確認します。
OK、ここで介入しなければなりません。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");
}
いつものように、明らかな答えは常に見逃されます。
私の場合、関数は、引数を期待していなかったが、ボタンは、エラーの原因となるものを送信するように設定されました。この問題を解決するために、私は、イベントハンドラを再配線する必要がありました。
ここに私の関数である。
これは引数が含まれていません注意してください。
ここに私のボタン構成の画像である(右のそれを表示するボタンをクリックしてください):
3件のイベントハンドラがあることに注目してください。
私はそれらの一つがenterPressed関数に自分自身への参照を送っていたので、イベントの各項目を削除する必要がありました。この問題を解決するには。示さ全く項目がなかったまで、私は、各項目の名前の隣に小さなXアイコンをクリックしたこれらの項目を削除します。
次は私がイベントにボタンを再接続する必要がありました。これを行うには、Controlキーを押しながらアクションにボタンから行をドラッグします。これは、「接続アクション」と言うべきです。注意:私は、これはいくつかの理由のために働くためにはXCodeを再起動する必要がありました。それ以外の場合は、私だけが、機能上または下に(別名新しいアクションを作成する)アクションを挿入してみましょう。
これで、引数を渡していないボタンイベントに配線単一のイベントハンドラを持つべきです
この答えはあなたにも読んでください@Leonardチャリスによって答えを補完します。
あなたがインターフェイスビルダーのビューの「クラス」を設定しない場合、これがまた起こることができます。
私の場合、私はNSNotificationCenterを使用していたし、引数を取っていないセレクタを使用しようとしましたが、コロンを追加しました。コロンを削除すると、問題を修正します。
セレクタ名を使用する場合は引数がない場合は、、末尾にコロンを使用しないでください。一つの引数がある場合、1つの末尾にコロンを使用します。複数の引数がある場合は、各引数の末尾にコロンでそれらを一緒に指定する必要があります。
ここでアダムローゼンフィールドの回答を参照してください:?セレクタでのObjective-C の
私は動的にボタンを作成していスウィフトプロジェクトでこの問題を抱えていました。問題のコード:
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).")
}
(完全を期すために含まれています)この最も明白な原因は、不適切なポインタをキャストすると、間違ったクラスのメソッドを呼び出すされます。
NSArray* array = [[NSArray alloc] init];
[(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception
私は同様の問題があったが、私のための溶液はわずかに異なっていました。私の場合、私はいくつかのリサイズ機能のために、既存のクラス(UIImageを拡張するカテゴリーを使用 - この<のhref = "http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimageを参照してください-the-右ウェイ/」のrel = 『nofollowを』タイトル= 『ハウツーリサイズ』>あなたが興味を持っている)と、ビルドターゲットに* .mファイルを追加するのを忘れた場合にハウツーを。愚かな誤りが、常に明白ではない、それが見えることを起こります。私はそれが共有する価値だと思った...
私は同じエラーを持っていたと私は、次を発見します:
あなたがコードを使用すると、
[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上スタンフォード大学のiOSコースをやっています。だから私はまだiOSの6.1のために構築していますが、これは私のために問題を解決します。
私も同じ問題を持っています。
私は今、すべてが正常に動作します。..私のストーリーボードに私のuibuttonを削除し、それを再作成しました。
これは私に何が起こった偶然そうストーリーボードでは、私のUIViewControllerクラスのコード内で「@IBAction funcを...」消去するので、参考アウトレットを作成しますが、実行時に、それを処理するために、任意の関数がありました。
ソリューションは、プロパティインスペクタ内のアウトレットの参照を削除してから、クラスコードにコマンドキーでドラッグ、それを再作成することでした。
それが役に立てば幸い!
私はあなたの戻り値の型に代わりIBActionの空隙を使用するべきだと思います。あなたがプログラムでボタンを定義したので。
もう1つの可能な解決策:追加 '-ObjC' リンカ引数に
。完全な説明はここにある:静的ライブラリでのObjective-Cカテゴリ>
私は要点があると思う:カテゴリはあなたが静的にリンクしているライブラリで定義されている場合、リンカは、カテゴリメソッドにリンクするには十分にスマートではありません。上記のフラグはすべて客観Cクラスとカテゴリでのリンカのリンクを作るだけではなく、もの、それのは、それはあなたのソースを分析に基づいてする必要がありますの考えています。 (チューニングするために自由に感じたりその答えを修正します。私は、リンクされた言語に知っていたので、私はちょうどここparrotingていてください)。
私は現在、iOSの開発を学習し、プレスカンファレンスによる「始まりiOS6開発」本をつもりです。私は第10章で同じエラーを取得した。ストーリーボードを
これは、それを把握するために二日かかったが、私は持っていなければならないとき、私は誤って1にテーブルビューセルのタグを設定して発見しました。誰がこの本を行うため、私はこれが役に立てば幸い同様のエラーが表示されます。
私は本当に私のコードでは、将来のエラーを見つけるのは簡単ですね!ははは。デバッグエラーがそれを考え出すに正しい方向に私をプッシュする何もしなかった(または少なくとも私は笑、デバッガを理解するにはあまりにも新しいです)。
私の場合は、のUIWebViewを使用していたし、私の代わりにNSURLの2番目のパラメータにNSStringのを可決しました。だから私は、関数に渡される間違ったクラス型は、このエラーを引き起こす可能性があることを疑います。
..そして今、私の
私は別のボタンのパラメータにアクセスし、それは素晴らしい仕事しかし、すぐに私はボタン自体に何かをしようとした方法にリンクされているボタンを持っていた、私がクラッシュを得ました。コンパイル中に、エラーが表示されていない。..ソリューション?
私は、ファイルの所有者に、ボタンをリンクに失敗しました。ここでは誰も私と同じくらい愚かであれば、これを試してみてください。)
さらに別の若干異なる溶液/ケース。
私はXamarinとMvvmCrossを使用していると私はViewModelににUIButtonをバインドしようとしていました。私はUIButtonはアウトレットとTouchUpInsideまで配線していた。
バインドするときに、私は唯一のアウトレットを使用します:
set.Bind (somethingOutlet).For ("TouchUpInside").To(vm => vm.Something);
私がしなければならなかったすべては、Xcodeでのアクション(TouchUpInside)接続を削除し、それはそれを解決しました。
P.S。 私は、これはそのベースに、以前の回答に、特に@クリスKaminskiに関連するすべてのだと思いますが、私はこれが誰かの役に立てば幸い...
乾杯。
私は同じ問題がありました。私にとっての問題は、一つのボタンが2つのアクションメソッドを持っていたということでした。私がやったことは私のボタンの最初のアクションメソッドを作成し、次にビューコントローラでそれを削除したが、接続インスペクターのメインストーリーボードでの接続を切断するのを忘れました。私は2番目のアクションメソッドを追加したときに、エラーの原因となった一つのボタンには2つのアクション・メソッドは、今ありました。
私にとって、それはinterfacebuilder BIJのCTRL-ドラッグで作成した残りの接続でした。切断された接続の名前は、エラー・ログにあった。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[NameOfYourApp.NameOfYourClass nameOfCorruptConnection:]:
unrecognized selector sent to instance 0x7f97a48bb000'
私はボタンにリンクされているアクションを持っていました。アウトレットは、もはや私のコードに存在していたので、ボタンを押すと、アプリがクラッシュしません。 ログ内の名前を検索すると、ストーリーボードでそれに私を導きました。それを削除し、そしてクラッシュが消えていた!
私の場合では、私は2時間後に問題を解決しました
の送信者(タブバー項目)のいずれかの参照出口を有するはなかったです。だから、どこにも向いていなかった。
ジュストのあなたの関数に対応するを参照のアウトレットを作成します。
は、これはあなたたちを助けることを願っています。
私は、レナードチャリスに返信しています
"キャッチされない例外により 'NSInvalidArgumentException' にアプリを終了、理由:"
問題は、私は二回接続電卓の「Enter」ボタン、と友人はストーリーボードにボタンの検査を行うことは2つのエントリはときI「タッチアップインサイドは」属性にあったことを示したことを指摘していたことでした右の「Enter」ボタンをクリック。 2「タッチアップインサイド」「送信済みイベント」のいずれかを消去すると、問題を解決します。
この問題は、例外の原因となったそのうちの一つ2つの送信イベントとして(割当1で計算チュートリアルにC193Pビデオクラス)トリガされることを示した。
これは、発生する可能性があります InterfaceBuilder。だから、ViewController.mがどのシーンに接続されていません。
私の分け前を含みます。私は<のhref = "http://longweekendmobile.com/2011/09/07/objc-automatic-reference-counting-in-xcode-でプロジェクトを作成しまし実現するまで私は、しばらくの間、これに捕まってしまいました/」のrel = "nofollowを"> ARC(自動カウント参照)を無効に説明しました。そのオプションにYESへの迅速なセットは私の問題を解決します。
この別の本当に愚かな原因は、インターフェイス(.H)で定義されたセレクタを有するされなく実装(.M)(P。E.タイプミス)で
もう一つの理由/ソリューション。この1は、iOS6.0(および/または不正プログラム)によって引き起こされます。パラメータの型が一致した場合は、古いバージョンでは、セレクタは一致しますが、iOSの6.0に私は、以前のパラメータの名前が正しくありませんでしたコードを作業中にクラッシュを得ています。
私は
のようなものをやっていました[objectName methodName:@"somestring" lat:latValue lng:lngValue];
が、私が持っていた定義(.Hおよび.M両方)での
(viod) methodName:(NSString *) latitude:(double)latitude longitude:(double)longitude;
これは、iOS5を上ではなく、6上の異なるデバイスに展開しても、まったく同じビルドうまく働いています。
コンパイラは、とにかく、私はこのことを言うcoudn'tなぜ私は得ることはありません - 。問題は、ソール
カスタムControllerBクラス内のパブリックプロパティにControllerAからプロパティを設定したいときにも起こるかもしれないとあなたはまだ絵コンテにおけるアイデンティティインスペクタ内の「カスタムクラス」を設定していない。
私の問題と解決策は違っていたと私は将来の読者が壁に叩いてから自分の頭を保存することができますように、私はそれをここに投稿しなければならないと思いました。
私は同じのUIViewControllerに異なるXIBを割り当てたとでもどこでも検索した後、私はそれを修正する方法を見つけることができませんでした。それから私は、私はinitWithNibName
を呼んでいたし、コードをコピーしている間、私はXIB名を変更していることがわかります私AppDelegateをチェックしますが、UIViewController
クラスを変更するのを忘れ。ソリューションのどれがあなたのために働かないのであれば、あなたのinitWithNibName
方法を確認します。
ので矛盾する制約の引数の私に起こっています。