0

UIViewController が別のビュー コントローラーを提示する場合、提示されたビュー コントローラーが iOS 5 で完了したときにそれ自体を閉じる最も簡単な方法は、次を呼び出すことです。

[[self presentingViewController] dismissViewControllerAnimated:YES completion:NULL];

一方、Apple のView Controller Programming Guideには次のように書かれています。

提示されたビュー コントローラーを閉じるときが来たら、推奨されるアプローチは、提示しているビュー コントローラーにそれを閉じさせることです。つまり、可能な限り、View Controller を提示した同じ View Controller が、それを破棄する責任も負う必要があります。提示されたView Controllerを破棄する必要があることを提示側のView Controllerに通知する方法はいくつかありますが、推奨される方法は委譲です。

これにより、非常に単純なView Controllerのみが提示されている場合でも、新しいプロトコルと委任の作成に固執することを提案するいくつかの回答がここに導かれました. 上記の単一行ではなく、なぜこれがドキュメントの「推奨手法」なのですか? デリゲート/プロトコル手法を使用して記述されたコードの大幅な増加のマイナス面を相殺する利点はありますか? 明らかに、提示されたView Controllerから、提示しているView Controllerに戻す必要がある情報がある場合、委譲は適切な手法です。ただし、情報は委任の理由であり、表示されたビュー コントローラーを画面からきれいに削除するだけではありません。

4

2 に答える 2

3

一度に (モーダルに) 表示されるビュー コントローラーは常に 1 つだけであるため、[self dismissViewControllerAnimated:YES completion:nil](iOS 5 より前に)同じ動作を実現できます。[self dismissModalViewControllerAnimated:YES]

ただし、委任パターンの要点は、モーダルやナビゲーション スタックへのプッシュなど、さまざまな方法で単一のビュー コントローラーを表示できることです。そのView Controllerは、それがどのように提示されたかを知りません(まあ、それを理解することはできますが、気にする必要はありません). 実行すべき唯一のことは、その作業が完了したことをその親、つまりデリゲートに通知することです。次にデリゲートは、View Controller を削除する方法 (ナビゲーション スタックからモーダルやポップを破棄するなど) を決定するか、その作業の結果が不十分であるため子を残す必要があるかを決定します。したがって、主なアイデアはView Controllerの再利用性です。

于 2012-07-22T23:23:40.237 に答える
1

[[self presentingViewController] dismissViewControllerAnimated:YES complete:NULL];

これが最も簡単かもしれませんが、あまり役に立たないことがよくあります。

モーダルビューは通常、発信者に情報を返す必要があります。それが彼らがモーダルである理由です。従来のSDKでは、モーダルウィンドウは、モーダルウィンドウが閉じられるまで呼び出し元をブロックします。その後、モーダルウィンドウの結果が呼び出し元に返されます。例えば:

int result = ShowModalDialog("Do you want to continue?");
if (result == kYes) 
{
    doSomething();
}
else
{
    return;
}

UIKitでは、-presentModalViewController:はブロックされないため、モーダルビューコントローラーが情報を現在のビューコントローラーに返すためのその他のメカニズムが必要です。通常、これは委任を使用して行われますが、他の方法もあります(たとえば、提示するコントローラーに左右のUINavigationBarボタンを処理させるなど)。

モーダルビューコントローラーがその提示ビューコントローラーに値を返す必要がある場合、それは委任を介して行われます。その場合、提示コントローラーが結果を受け取った後にモーダルコントローラーを閉じることは理にかなっています。それが元のパターンです。

于 2012-07-22T23:16:38.390 に答える