これはかなり複雑な継承階層なので、私には負担してください(使用している正確なケースを述べるのではなく、単純化しようとしました): -Objective-C - サブクラスのデリゲートのサブクラス
UITextField
というサブクラスを作成して、TextField
という独自のカスタム拡張拡張テキストフィールドを作成しています。ここで、この拡張機能を提供するために、TextField
というメソッドのinit
では、すべてのデリゲートメソッドUITextField
がTextField
に送信されるようにsuper.delegate = self
を設定しました。 TextField
はUITextFieldDelegate
プロトコルを実装し、これらのデリゲートメソッドを受信して何か面白いことをします。
しかし、次に、TextField
にはの代理人がいるようにしたいと思います。だからTextFieldDelegate
という新しいプロトコルを作成します(UI
-prefixがないことに注意してください)。TextField
には対応するプロパティを持つid<TextFieldDelegate> __weak delegate
のivar id<TextFieldDelegate> __weak delegate
が与えられ、他のクラスはTextField
から代理メソッドを受け取ることができます。
私はまだこれほど複雑すぎるものは何もしていないので、あなたはまだ私と一緒にいたいと思います。しかし今、私はTextField
の別のカスタムサブクラスを作成し、それをPasswordTextField
と呼ぶことにしよう(現実には、パスワード機能を実装するためにサブクラスを作成する必要はないだろうが、かなり洗練された実装があると仮定しよう。それはこれを必要とするだろう)。
PasswordTextField
(TextField
のようにデリゲートプロパティがある)が、デリゲートメソッドの拡張セットを送信できるようにしたいとしましょう。たとえば、パスワードが必要なレベルの複雑度に達すると送信されるメソッドpasswordIsSecure
を送ることができます。今度は通常のTextField
で見つからないこの動作以来、私はPasswordTextField
との新しいデリゲートメソッドを定義するPasswordTextFieldDelegate <TextFieldDelegate>
を作成し、TextField
によって送信されたすべてのデリゲートメソッドを継承します。
問題は次のとおりです。PasswordTextField
でこれを実装するにはどうすればよいですか?動作しないもの:
継承
TextField
のデリゲートだけTextFieldDelegate
なくPasswordTextFieldDelegate
に準拠しているので、私は単純に、TextField
からデリゲートを継承することはできませんので、私はので[delegate passwordIsSecure]
のようなメソッドを送信することはできませんTextFieldDelegate
にはそのような方法はありません。
私は、デリゲートと呼ばれるPasswordTextField
でIVARを宣言試みることができるが、コンパイラはもちろん、スーパークラスでデリゲートと呼ばれるIVARがすでに存在するため、これが重複宣言であると文句を言いますので、このIVAR
のオーバーライドいずれも*動作しません。変更
スーパー
私はTextField
クラスに戻って実装するデリゲートを再定義することができ、両方のTextFieldDelegate
とPasswordTextFieldDelegate
が、これは厄介なようで、それは、PasswordTextFieldDelegate
メソッドを送信できることTextField
を伝えているのもちろん、それはできません!
私はこの本を試したことはありません。なぜなら、本の中のすべての分かりやすいコーディング規則を破るように思えるからです。
要約すると、クラスのサブクラスがスーパークラスのデリゲートのサブデリゲートであり、このすべてがうまく収まるような独自のデリゲートを持つようにするには、何らかの方法が必要です。それを把握していない!何か案は?
は(*側の問題として、私はPasswordTextField
は、「複製」IVARという名前のデリゲートを宣言する際、コンパイラは文句理由を理解していないが、
TextField
はおそらく
UITextField
の複製であるIVARという名前のデリゲートを宣言したときに文句はありません
は暗闇の中でちょうど打撃を受けているかもしれませんが、idとして代理人の@propertyを再宣言して独自の合成をしても役に立ちませんか?私はそれが動作すると思います。それはしばらくしてから試してみてください –
govi