2017-11-30 15 views
0

#selector(内のメソッド名にコード補完が行われ、実行時にセレクタが認識されないというエラー(IllegalArgumentException)が発生してクラッシュします。Xcode9/Swift4でもUnrecognizedSelectorはどのように可能ですか?

セレクタ構文を単に文字列ではなく、やり直した点は何ですか?ここ

は、セレクタの生成である:(ここで参照)

headerAddButton.addTarget(section, action: #selector(addActivityToSpecificDay(sender:)), for: .touchDown) 

セクションは、テーブルビューのヘッダ部である(言及するのを忘れ、このコードはXcodeの9前に働いていた):

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
ここ

ハンドラのメソッドシグネチャである:Cの同じソースファイル内

@objc func addActivityToSpecificDay (sender :UIButton) 

私たち。しかし、質問を読んでください:もしコードの補完がそれが地球上のどのように私がランタイムクラッシュを得るかを見つけることができますか?

+0

あなたのメソッドに '@ objc'タグが付けられ、' @ objc'タグ付きメソッドをオーバーライドするか、 '@ obj'プロトコルの要件を満たしていますか? – vacawama

+1

コードを表示してください。 – creeperspeak

+0

はいそれは@objcを持っています – Rob

答えて

3

あなたがそうのようにターゲットを追加している:

headerAddButton.addTarget(section, action: #selector(addActivityToSpecificDay(sender:)), for: .touchDown) 

あなた#selectorクラスにaddActivityToSpecificDayを修飾しない、それは明らかに、現在のクラスでその名前のいくつかの方法で、最大マッチングされないでいるのでどんなクラスsectionです。

2つのオプションがあります。どんなクラスsection

  1. 移動addActivityToSpecificDayがある(説明の目的のために、のは、それがSectionClassだったとしましょう)とあなたの#selector参照そのクラス:

    headerAddButton.addTarget(section, action: #selector(SectionClass.addActivityToSpecificDay(sender:)), for: .touchDown) 
    
  2. addActivityToSpecificDayを現在のクラスに維持しますが、addTargetのターゲットをselfに変更してください:

    headerAddButton.addTarget(self, action: #selector(addActivityToSpecificDay(sender:)), for: .touchDown) 
    

あなたは尋ねる:

もはや単なる文字列としてセレクタ構文をやり直すのポイントは何でしたの?

それは、セレクタの機能が存在しても(非常に良いことである)が形成されていることを検証しますが、それは明らかに、セレクタのクラスは、他のいくつかのパラメータ(この中targetと同じクラスであることを起こることを検証することはできません例)。コンパイラは、addTargetメソッドがセレクタをどのように使用するか、または2つのパラメータ間に特別な関係があることを確実に知ることはできません。それは開発者に委ねられています。 #selectorの構文は役立ちますが、それは魔法の弾丸ではありません。

関連する問題