私はしばらくセレクタを使用してきましたが、Swiftに移行した後でも問題なく使用できました。それがSwift 2 Xcodeをバージョン7.3に更新するまで問題なく:
使用方法を見るとわかるように、NSTimerでセレクターを使用しています。
これは呼び出されるアクションです。
func Start () {
}
ご覧のとおり、Xcode 7.3は「Objective-Cセレクターでメソッドが宣言されていません」という警告を表示します。警告をクリックすると、Xcodeは「セレクタ」を追加してコードをすばやく修正しますが、それでも同じ警告が表示されます:
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はデフォルトで簡単な修正を提供します。次の状況にある場合、黄色の三角形をタップします(複数回タップ/クリックする必要がある場合があります)。
次の両方のステートメントは完全に機能します。上の方が主に使用されます。ただし、セレクターメソッドが別の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")
}
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の要求に応じて設定を更新しました。
これ以上の警告はありません。すべて正常に動作しているようです。
ヴィンセントが言ったことをサポートするための私自身のいくつかの発見(長すぎて直接のコメントではない)
必ずしも別の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)