2017-02-01 7 views
1

8.2.1スウィフト:パラメータを渡すと、セレクタにスウィフト3のXcodeを使用

方法:

func moveToNextTextField(tag: Int) { 
    print(tag) 
} 

ラインは以下の微細コンパイルが、初期化されていない値tag有する:

let selector = #selector(moveToNextTextField) 
Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: selector, userInfo: nil, repeats: false) 

しかし、私はパラメータを渡す必要があります。以下はコンパイルに失敗します。

let selector = #selector(moveToNextTextField(tag: 2)) 

Swift Compile Error: 
Argument of #selector does not refer to an @objc method, property, or initializer. 

セレクタに引数を渡すにはどうすればよいですか?

答えて

6

#selectorは、メソッドシグネチャのみを記述します。あなたの場合、セレクタを初期化する正しい方法は、

let selector = #selector(moveToNextTextField(tag:)) 

です。タイマーは共通のターゲットアクションメカニズムを持っています。ターゲットは通常自己であり、アクションは1つのパラメータsender: Timerを取るメソッドです。あなたはuserInfo辞書に追加のデータを保存し、法にsenderパラメータからそれを抽出する必要があります

func moveToNextTextField(sender: Timer) { 
    print(sender.userInfo?["tag"]) 
} 
... 
let selector = #selector(moveToNextTextField(sender:)) 
Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: selector, userInfo: ["tag": 2], repeats: false) 
+1

@ user1107173は、いくつかのコードで答えを更新しました。 – hybridcattt

+0

ヴァディアンは正しいです。タイマーを使用してカスタムパラメータを渡すことはできません。タイマーのuserInfoフィールドにパラメータをインストールする必要があります。セレクタは、パラメータとしてタイマーを渡すことも、パラメータを渡すこともできません。 –

3

あなたはTimer作用を介してカスタムパラメータを渡すことはできません。

どちらか

#selector(moveToNextTextField) 
... 
func moveToNextTextField() 

または

#selector(moveToNextTextField(_:)) 
... 
func moveToNextTextField(_ timer : Timer) 

、他に何もサポートされていません。

カスタムパラメータを渡すには、userInfo辞書を使用します。

関連する問題