web-dev-qa-db-ja.com

Xcode 7.3 / Swift 2:「Objective-Cセレクターでメソッドが宣言されていません」という警告

私はしばらくセレクタを使用してきましたが、Swiftに移行した後でも問題なく使用できました。それがSwift 2 Xcodeをバージョン7.3に更新するまで問題なく:

enter image description here

使用方法を見るとわかるように、NSTimerでセレクターを使用しています。

これは呼び出されるアクションです。

 func Start () {

 }

ご覧のとおり、Xcode 7.3は「Objective-Cセレクターでメソッドが宣言されていません」という警告を表示します。警告をクリックすると、Xcodeは「セレクタ」を追加してコードをすばやく修正しますが、それでも同じ警告が表示されます: enter image description here

43
tomDev

Swift 2.2/Xcode 7.3)からセレクタを使用する新しい方法があります:Selector("funcName")#selector(ClassName.funcName)に変更されました

https://github.com/Apple/Swift-evolution/blob/master/proposals/0022-objc-selectors.md をご覧ください

tl; dr;

Selector("Start")#selector(YOUR_CLASS.Start)に置き換えます

yOUR_CLASS =指定されたコンテキストのターゲットのクラス。

手動で行いたくない場合、Xcodeはデフォルトで簡単な修正を提供します。次の状況にある場合、黄色の三角形をタップします(複数回タップ/クリックする必要がある場合があります)。

enter image description here

それはあなたに提案を与えます: enter image description here

その提案を選択すると、セレクターが自動的に更新されます: enter image description here

88
ogres

次の両方のステートメントは完全に機能します。上の方が主に使用されます。ただし、セレクターメソッドが別のViewControllerにある場合、「Objective-Cセレクター 'buttonHandler'で宣言されたメソッドはありません」というコンパイラー警告が発生する場合があります。

2番目にリストされているステートメントは、この警告を出しません。

button.addTarget(parentViewController, action: Selector("buttonHandler:"), forControlEvents: .TouchUpInside)

button.addTarget(parentViewController, action: #selector(MainViewController.buttonHandler), forControlEvents: .TouchUpInside)

ターゲットView Controller(MainViewController)で、モジュールを定義できます。

func buttonHandler(sender:UIButton!) {
    print ("Pressed")
}
4
Vincent

On Swift 4警告を取り除くためにfuncの前に@objcを追加する必要がありました。

NSTimerでfuncを呼び出す方法は次のとおりです。

 Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.intro), userInfo: nil, repeats: false)

これがfuncの宣言方法です。

     @objc func intro () {

          // do your stuff here         

     }

また、Xcodeの要求に応じて設定を更新しました。

enter image description here

これ以上の警告はありません。すべて正常に動作しているようです。

2
tomDev

ヴィンセントが言ったことをサポートするための私自身のいくつかの発見(長すぎて直接のコメントではない)

必ずしも別のView Controllerにあるわけではなく、次のフォーマットが機能しない別のファイルにあるだけです。

button.addTarget(parentViewController, action: Selector("buttonHandler:"), forControlEvents: .TouchUpInside)

たとえば、別のファイルに拡張子がある場合、同じView Controllerの場合、この形式Selector("buttonHandler:")は機能しません。

さらに、セレクタisが同じファイルとVCにある場合、Xcodeのクイックフィックスは、セレクタにコンストラクタを含めるように要求するため、次のようになります。

#selector(MainViewController.buttonHandler(_:))

ただしこの形式は、セレクターが同じVC +ファイルにある場合、別のファイルにあるが同じVCにある場合にのみ機能します。動作し、コンストラクタなしでメソッドを使用する必要があります

#selector(MainViewController.buttonHandler)

0
EricK