1

このコントローラーには、メソッドがほとんどないデリゲート プロトコルを実装する子コントローラーがあります。

ParentController : UIViewController <ChildControllerDelegate>

親コントローラーには、それ自体から呼び出されるメソッドがあります(呼び出しますdoSomething)。

doSomethingここで、子コントローラー内のボタンからこのメソッドを呼び出す必要があります。だから私は3つのオプションを考えることができます:

  1. プロトコルにメソッドを追加しpleaseCallDoSomething、ボタンからこのメソッドを呼び出してから、このpleaseCallDoSomethingメソッドを親ビュー コントローラーに実装し、最後にdoSomething内の を呼び出しますpleaseCallDoSomething
  2. 2 番目のオプションは、子ビュー プロトコルに新しいメソッドを登録せず、単に以下を使用することです。

    [btn addTarget:self.delegate action:@selector(doSomething) forControlEvents:UIControlEventTouchUpInside];
    
  3. プロトコルにメソッドを追加doSomethingして親ビュー コントローラーに実装し、親ビュー コントローラー内で必要に応じてローカルで呼び出します。(デリゲートからローカルでデリゲート メソッドを呼び出すことを意味します)。

ベストプラクティスは何ですか?

ありがとうシャニ

4

2 に答える 2

1

デリゲートをボタンのターゲットとしてバインドしないでください。デリゲート プロパティは、保持サイクルを回避するために弱いと宣言されている可能性があります。ターゲットとして割り当てると保持サイクルが発生し、ボタンを削除しない限り、オブジェクト階層全体が割り当て解除されることはありません。

親<--強-->子<--弱-->親

親<--strong-->ボタン

ターゲット割り当て後

親<--strong-->子<--strong-->ボタン<--strong-->親

また、ボタンはコントローラー階層について何も認識してはならないので、ビューが元のコントローラー以外のオブジェクトと通信できるようにするのは悪いMVCだと思います。これにより、遅かれ早かれ常に問題が発生します。

于 2012-05-10T05:15:07.710 に答える
0

UIControlEvents からデリゲート メソッドを直接呼び出すことをお勧めします。とにかく、ボタンがターゲットとセレクター引数から呼び出しを構築するので、これは msg_send と基本的に同等です。また、仲介者メソッドを呼び出すことで発生するわずかなペナルティが発生しないため、オーバーヘッドが削減されます。

于 2012-05-10T03:49:52.493 に答える