169

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

-[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(@"---");
}
4

39 に答える 39

193

ビューコントローラを適切にメモリ管理しておらず、ある時点で割り当てが解除されているようです。これによりnumberButtonClicked:、ビューコントローラが以前占有していたメモリを占有している別のオブジェクトにメソッドが送信されます...

ViewControllerを適切に保持/解放していることを確認してください。

于 2010-03-16T14:40:08.313 に答える
133

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

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

に変更されました:

- (IBAction)buttonPressed {

問題のUIButtonを右クリックすると、Touch Up InsideイベントがビューコントローラのbuttonPressed:メソッドに関連付けられていることがわかりました。これを削除し、変更されたメソッドに再割り当てすると、うまくいきました。

于 2012-01-31T18:09:26.497 に答える
79

これはこの問題に対するGoogleの一番の答えでしたが、私には別の原因/結果がありました。他の人がこの問題に遭遇した場合に備えて、2セントを追加すると思いました。

今朝も同じような問題がありました。問題が発生したUIアイテムを右クリックすると、作成された接続を確認できることがわかりました。私の場合、2つのアクションまで配線されたボタンがありました。右クリックメニューからアクションを削除して再配線すると、問題が修正されました。

したがって、アクションが正しく配線されていることを確認してください。

于 2012-07-08T15:19:24.467 に答える
25

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");
}

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

于 2013-05-20T16:33:42.733 に答える
24

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

これが私の関数です:

ここに画像の説明を入力してください

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

これが私のボタン構成の画像です(ボタンを右クリックして表示します):

ここに画像の説明を入力してください

3つのイベントハンドラーがあることに注意してください。

これを修正するには、イベントアイテムの1つが、それ自体への参照をenterPressed関数に送信していたため、各イベントアイテムを削除する必要がありました。これらのアイテムを削除するには、アイテムが表示されなくなるまで、各アイテムの名前の横にある小さなxアイコンをクリックしました。

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

これで、引数を渡さないボタンイベントに接続された単一のイベントハンドラーができました。

ここに画像の説明を入力してください

この回答は、@LeonardChallisによる回答を補完するものです。これも読む必要があります。

于 2013-03-05T21:31:55.227 に答える
14

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

于 2012-09-18T17:51:43.867 に答える
13

私の場合、NSNotificationCenterを使用していて、引数を取らないセレクターを使用しようとしましたが、コロンを追加していました。コロンを削除すると、問題が修正されました。

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

ここでAdamRosenfieldの答えを参照してください:Objective-Cのセレクター?

于 2012-09-15T03:40:57.500 に答える
11

ボタンを動的に作成している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

于 2014-07-25T16:18:14.273 に答える
8

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

NSArray* array = [[NSArray alloc] init];
[(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception
于 2013-03-13T20:39:21.930 に答える
4

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

ストーリーボードのuibuttonを削除して再作成しました。これで、すべてが正常に機能します。

于 2017-01-11T15:10:01.677 に答える
3

別の可能な解決策:リンカー引数に「-ObjC」を追加します。

完全な説明はここにあります:静的ライブラリのObjective-Cカテゴリ

要点は次のとおりです。静的にリンクしているライブラリでカテゴリが定義されている場合、リンカはカテゴリメソッドでリンクするほど賢くありません。上記のフラグは、ソースの分析に基づいて必要と思われるものだけでなく、すべてのObjectiveCクラスおよびカテゴリでリンカーリンクを作成します。(その答えを自由に調整または修正してください。私はリンクされた言語を知っているので、ここでオウムを書いています)。

于 2013-02-18T16:56:36.443 に答える
3

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

于 2012-11-07T10:23:22.377 に答える
3

これは、UIViewcontrollerクラスコード内の「@IBActionfunc ...」を誤って消去したために発生しました。そのため、ストーリーボードにリファレンスアウトレットが作成されましたが、実行時にそれを処理する関数がありました。

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

それが役に立てば幸い!

于 2017-01-14T15:03:41.363 に答える
2

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

于 2012-09-11T15:28:47.287 に答える
2

同じエラーが発生し、次のことを発見しました。

コードを使用する場合

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

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

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

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

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

そのセレクターは存在しないため、クラッシュします。

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

しかし、送信者を提供せずに更新関数を呼び出す他の関数がある場合はどうなりますか?両方で機能する1つの関数が必要です。簡単な解決策は、別の関数を追加することです。

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

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

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

また、最新バージョンのMacOSXにアップグレードできない古いMacでStanfordiOSコースを受講しています。だから私はまだiOS6.1用にビルドしていて、これで問題は解決しました。

于 2014-01-25T17:37:20.210 に答える
2

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

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

Justeは、関数に対応する参照アウトレットを作成します。

これが皆さんのお役に立てば幸いです。

于 2018-08-24T13:30:54.153 に答える
1

私は現在iOS開発を学んでおり、aPressの「BeginningiOS6Development」の本を読んでいます。第10章:ストーリーボードでも同じエラーが発生していました。

それを理解するのに2日かかりましたが、TableViewセルのタグを誤って1に設定してしまったことがわかりました。この本をやっていて、同様のエラーを受け取った他の人にとって、これがお役に立てば幸いです。

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

于 2013-03-28T11:31:44.687 に答える
1

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

于 2013-04-02T21:20:40.540 に答える
1

..そして今私の

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

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

于 2014-03-24T17:16:07.747 に答える
1

さらに別のわずかに異なるソリューション/ケース。

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

バインドするときは、アウトレットのみを使用します。

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

私がしなければならなかったのは、XCodeのアクション(TouchUpInside)接続を削除することだけで、それで解決しました。

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

乾杯。

于 2015-03-20T00:35:48.117 に答える
1

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

于 2016-03-01T22:22:33.683 に答える
1

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

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

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

于 2016-09-12T09:32:29.560 に答える
1
于 2021-02-01T17:14:09.390 に答える
0

これのもう1つの本当にばかげた原因は、インターフェイス(.h)でセレクターが定義されているが、実装(.m)では定義されていないことです(pe typo)

于 2012-12-13T10:54:40.063 に答える
0

リストに追加するもう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では機能しませんでした。まったく同じビルドが異なるデバイスにデプロイされていても。

とにかく、コンパイラがこれを教えてくれない理由がわかりません-問題は解決しました。

于 2013-01-10T04:23:53.207 に答える
0

ユーザー「oli206」と同様に、スタンフォードiOSクラスC193Pも受講していたため、LeonardChallisに返信します。

「キャッチされなかった例外「NSInvalidArgumentException」が原因でアプリを終了しています。理由:」

問題は、電卓の「Enter」ボタンが2回接続されていて、ストーリーボードのボタンを調べたところ、右クリックすると「TouchUpInside」属性に2つのエントリがあることがわかったと友人が指摘しました。 「Enter」ボタン。2つの「TouchUpInside」「SentEvents」のいずれかを消去すると、問題が解決しました。

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

于 2012-10-12T14:41:16.893 に答える
0

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

于 2012-11-15T12:13:19.600 に答える
0

私のシェアを含みます。ARC(自動カウント参照)を無効にしてプロジェクトを作成したことに気付くまで、しばらくこれに固執していました。そのオプションで[はい]にすばやく設定すると、問題が解決しました。

于 2012-12-03T21:24:32.253 に答える
0

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

于 2013-02-05T02:47:27.850 に答える
0

私の問題と解決策は異なっていたので、将来の読者が壁にぶつかるのを防ぐことができるように、ここに投稿する必要があると思いました。

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

于 2013-08-10T22:13:00.460 に答える
0

競合する制約引数のために私に起こりました。

于 2013-11-07T23:36:12.303 に答える
0

基本:動的呼び出し

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

解決

@selectorのどの署名が期待されているかを確認してください。あなたがコードで説明したように、通常はそうです

-(IBAction)numberButtonClick:(id)sender{
于 2014-05-14T11:13:40.093 に答える
0

私も問題を抱えていて、ついに問題の解決策を見つけました。controller's UIストーリーボードでビルドされましたが、controller's UIその制御をコードに関連付けていなかったので、このコードを使用して初期化しますvc

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

上記のこのコードは問題を引き起こします、そして私がinit以下のコードをこれに変更した後、私は問題を解決しました:

HeaderViewController *head_vc = [[HeaderViewController alloc] init];
于 2016-07-21T05:41:29.240 に答える
0

Swift3で古いフォーマットのコードを試してみると、この問題が発生しました。

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

action:"respond:"アクションへの変更:#selector(self.respond)問題を修正しました。

于 2016-11-04T08:44:29.690 に答える
0

Swift2からSwift3に切り替えた後、これが発生しました。以下の説明は具体的ですが、一般的なケースで多くの考えられるエラーがカバーされていることがわかります。

deleteのサブクラスで呼び出されたメソッドがありSKNodeました。

func delete(thing: SomeType) 

にはすでにメソッドがありますがdeleteUIResponder私のメソッドは(意図せずに)オーバーロードしたため、正常に機能していました。Swift 3にアップグレードすると、次のように変更されました。

func delete(_ thing: SomeType) 

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

func delete(thing: SomeType)

呼び出し元を更新することを覚えていればうまくいきましたが、今はそうではありませんでした。呼び出し元は、間違ったタイプの引数を使用してno-parameter-namedeleteメソッドを呼び出しています。UIResponder

これは明らかに、引数としてとられるSKNode(そしておそらく)標準メソッドの長いリストのいずれかで発生する可能性があるため、コンパイルフェーズを通過しますが、呼び出されるとフォールオーバーします。UIViewAny

于 2017-03-10T20:47:21.283 に答える
0

私の場合は次のとおりです。ビュー内のcollectionView

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

override func awakeFromNib() {

   //other code

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

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

これが誰かを助けることができることを願っています。

于 2018-06-06T12:08:20.600 に答える
0

私の場合:

私のプロトコル定義

 @protocol MyProtocol

- (void)Method;

@end

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

それが誰かを助けることができることを願っています。

于 2018-08-23T03:48:56.423 に答える
0

OKリストアップ!私はXCODEに非常に慣れていないので、この問題が発生し、それを理解しました。それがあなたのように聞こえるなら、ここに答えがあります:

ボタンをControlキーを押しながらクリックしてViewControllerファイルにドラッグすると(コード化できるように)、ポップアップにボタンのプロパティを入力するように求められます。

ポップアップの下部([タイプ]の下)に「送信者」と表示されます。

「なし」に変更する必要があります

于 2020-08-16T22:00:44.617 に答える
0

私の場合、iOS 13では、メインスレッドに配置された関数とセレクター呼び出し部分全体を実装するだけで済みました。

于 2020-08-21T05:10:55.213 に答える