3

このコードは、プロジェクトの作成時に Apple によって追加されたユーティリティ アプリからのものです。

これの違いは何ですか:

- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller
{
    [self dismissModalViewControllerAnimated:YES];
}

この:

- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller
{
    [controller dismissModalViewControllerAnimated:YES];
}

どちらも機能しますが、最初のものは、Apple によって追加されたユーティリティ アプリのメイン コードです。では、違いはありますか?なぜセルフは機能するのでしょうか? self は、FlipsideViewController ではなく、MainViewController です。わかりませんが、委任と関係がありますか? ありがとうございました。

4

2 に答える 2

2

答えはすでに正しいものとして選択されており、Sergio は委任についてうまく説明していることは知っていますが、この特定のケースでは、答えははるかに単純です。selfこの場合、controller同じものではありません(質問でも言っているように)。self提示コントローラでcontrollerあり、提示されたものです。したがって、両方の呼び出しが機能する理由は次のとおりです。

表示側のビュー コントローラーは、表示されたビュー コントローラーを閉じる役割を果たします。ただし、提示されたView Controller自体でこのメソッドを呼び出すと、メッセージが提示元のView Controllerに自動的に転送されます。

上のAppleのドキュメントからUIViewController

于 2012-06-28T08:51:30.820 に答える
2

それはすべて、実行中のオブジェクトに依存しますflipsideViewControllerDidFinish。と同じであれば、controllerまったく同じです。

実際には、デリゲートしているクラス (あなたの場合FlipsideViewController) がデリゲート プロトコルも実装する (つまり、デリゲートとして機能する) ことがあります。その場合、selfcontrollerは同じです。これは、次のようなデリゲートの初期化 (たとえば、init メソッド内) に対応します。

 self.delegate = self;

ただし、デリゲートを別のクラスにすることもできます (たとえば、アプリケーション デリゲートなど)。この場合、それらは異なります。この場合、(たとえば init で) 次のように言います。

self.delegate = [UIApplication sharedApplication].delegate;

この場合、アプリケーション デリゲートは呼び出しを受け取り、FlipsideViewController引数controllerはそれが参照するオブジェクトを示します。この場合、self!= controller.

もう 1 つのケースは、デリゲートが複数のオブジェクトのデリゲートとして機能している場合です。この場合、controller引数はどのオブジェクトが委譲されているかを示します。

実際には、デリゲート メソッドの実装内では、controllerあまり考えなくても安全に引数を使用できます。

于 2012-06-28T08:27:39.413 に答える