2017-07-21 7 views
2

ViewControllerは、その子の1つである「ViewControllers」によって生成されたターゲットアクションを処理したいと考えています。addTarget:action:forControlEvents:targetがnilの場合のセレクタ構文?

アップルの文書によると、targetnilに設定し、レスポンダーチェーンの後にすることで可能になるはずです。

あなたがターゲットオブジェクトのnilを指定した場合、制御は指定されたアクション メソッドを定義するオブジェクトのための レスポンダチェーンを検索します。 https://developer.apple.com/documentation/uikit/uicontrol

しかし、どのようにtargetnilあるとき、私はアクションメソッドのシグネチャを書くのですか?

通常、関数名は#selector()で囲みます。このシグネチャでメソッドが存在することをコンパイル時に確認できます。これと同じように:

class MyViewController: UIViewController { 
    override func viewDidLoad() { 
     self.button.addTarget(self, action: #selector(buttonPressed(sender:)), for: .touchDown) 
    } 

    func buttonPressed(sender: UIButton) { } 

} 

しかしtarget以来

が、それはそれを見つけることができないため、コンパイラは文句 nilです:

// ! Use of unresolved identifier "buttonPressed(sender:)" 
button.addTarget(nil, action: #selector(buttonPressed(sender:)), for: .touchDown) 

私は、文字列を使用してセレクタを初期化しようとしたが、コンパイラは文句を言います。

// ! String literal is not a valid Objective-C selector 
    button.addTarget(nil, action: Selector("buttonPressed(sender:)"), for: .touchDown) 

答えて

3

解決策は、定義するクラスの名前の前に接頭辞を付けることです。

button.addTarget(nil, action: #selector(MyViewController.buttonPressed(sender:)), for: .touchDown) 

はFYI私は、ソースファイルをダウンロードし、this nice blog post from Jan 2016を通じて答えを得た、とXcodeは

+0

:-)スウィフト3構文に変換した。しかし、これは確かにポイント敗北:レスポンダはセレクタに対応できることをレスポンダは明示的に事前定義されていません。 – Aodh

+0

どういう意味ですか?セレクタは 'MyViewController'で定義されたメソッドでなければなりません。私は子供の行動が親によって処理されるようにしたいので、セレクターを親に定義したい。 – MH175

+0

レスポンダチェーンメカ​​ニズムの考え方は、レスポンダが応答可能なチェーンの最初のものであり、レスポンダが応答するという明示的な名前付けがなく、疎結合が可能です。 – Aodh

関連する問題