9

ほとんどのオーバーロードされたメソッドには[super theMethod]呼び出しが必要です。

(例: [super viewDidLoad];[super viewWillAppear];および[super dealloc];)

電話が必要かどうかはよく考えなかった[super touchesBegan:withEvent:]のですが、どうにか役割を果たしているようです。

必要な場合と不要な場合はいつですか?

必要なときにタッチイベントをプログラムでキャンセルしようとしていますが、それは私が尋ねた質問に関連しているようです。

4

1 に答える 1

20

すべてはオブジェクトの予想される動作に依存しますが、基本的なことを指摘しましょう。スーパークラスによって実装されたデフォルトの動作が必要な場合は、オーバーライドされたメソッドでスーパークラスの実装を呼び出します (オーバーロードではなくオーバーライドを意味します)。

したがって、次の質問をする必要があります。

1) スーパークラスの実装は何をしますか?

2) オブジェクトに必要ですか?

では、スーパークラスの etc. は何をしtouchesBegan:withEvent:ますか? それはあなたのクラス階層に依存します。クラス階層内のカスタム クラスが既にこれらのメソッドをオーバーライドしている可能性があり、それらの動作が必要な場合とそうでない場合があります。カスタム クラスはまだこれらのメソッドをオーバーライドしていないと思いますので、Cocoa の実装のみを確認する必要があります。

touchesBegan:withEvent:UIResponder クラスで最初に定義されます。UIResponder のドキュメントを見てみましょう。

このメソッドのデフォルトの実装は何もしません。ただし、UIResponder の直接の UIKit サブクラス、特に UIView は、メッセージをレスポンダー チェーンに転送します。

ここで理論が得られます。クラスが UIResponder から直接継承する場合、スーパークラスの実装を呼び出す必要はまったくありません。とにかく何もしないからです。UIView などの他の UIKit サブクラスから継承する場合、スーパークラスの実装を呼び出すと、レスポンダー チェーンにメッセージを転送できます。ただし、オーバーライドtouchesBegan:withEvent:はおそらく、サブクラスがタッチ イベント自体を処理する必要があることを意味するため、イベントをレスポンダー チェーンに転送したくない場合があります。したがって、ここでスーパークラスの実装を呼び出したくないと思います。

それは本当に状況に依存します。UIScrollView をサブクラス化し、touches...メソッドの 1 つを実装するとします。ユーザーがドラッグしたときにビューをスクロールしたい場合は、スーパークラスの実装を呼び出す必要があります。これは、スクロールを処理するためです。

要約すると、決定するには上記の 2 つの質問に答えることができなければなりません。スーパークラスの実装が何をするかを知るには、Apple ドキュメントを読んでください。多くの場合、スーパークラスの実装が一般的な予想される動作に不可欠である場合、ガイド ドキュメントでは、スーパークラスの実装を呼び出すように明示的にアドバイスしています。

于 2011-02-11T18:25:22.727 に答える