親ViewController
は、その子の1つである「ViewControllers
」によって生成されたターゲットアクションを処理したいと考えています。addTarget:action:forControlEvents:targetがnilの場合のセレクタ構文?
アップルの文書によると、target
をnil
に設定し、レスポンダーチェーンの後にすることで可能になるはずです。
あなたがターゲットオブジェクトのnilを指定した場合、制御は指定されたアクション メソッドを定義するオブジェクトのための レスポンダチェーンを検索します。 https://developer.apple.com/documentation/uikit/uicontrol
しかし、どのようにtarget
がnil
あるとき、私はアクションメソッドのシグネチャを書くのですか?
通常、関数名は#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構文に変換した。しかし、これは確かにポイント敗北:レスポンダはセレクタに対応できることをレスポンダは明示的に事前定義されていません。 – Aodh
どういう意味ですか?セレクタは 'MyViewController'で定義されたメソッドでなければなりません。私は子供の行動が親によって処理されるようにしたいので、セレクターを親に定義したい。 – MH175
レスポンダチェーンメカニズムの考え方は、レスポンダが応答可能なチェーンの最初のものであり、レスポンダが応答するという明示的な名前付けがなく、疎結合が可能です。 – Aodh