124

理論的な質問があります。今、Apple のViewControllerガイドを読んでいます。

彼らが書きました:

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

しかし、提示されたVCでプロトコルを作成し、デリゲート変数を追加し、提示されたVCを却下するために提示されたVCでデリゲートメソッドを作成する必要がある理由を説明できません。提示されたView Controllerメソッドでの単純な呼び出しではありません

[self dismissViewControllerAnimated:NO completion:nil]?

最初の選択が優れているのはなぜですか? Apple が推奨する理由

4

14 に答える 14

133

Apple は、API の潜在的に厄介な部分について、ここで少し隠れていると思います。

  [self dismissViewControllerAnimated:NO completion:nil]

実際には少しフィドルです。提示されたView Controllerでこれを正当に呼び出すことはできますが、それが行うことは、提示しているView Controllerにメッセージを転送することだけです。VC を却下するだけでなく何かをしたい場合は、これを知る必要があり、デリゲート メソッドとほぼ同じように扱う必要があります。デリゲート メソッド。

おそらく、彼らは、これがどのようにまとめられているかを本当に理解していない人々による大量の悪いコードに出くわしたため、注意が必要です。

しかし、もちろん、あなたがする必要があるのは物事を却下することだけであれば、先に進んでください.

私自身のアプローチは妥協です。少なくとも、何が起こっているかを思い出させてくれます。

  [[self presentingViewController] dismissViewControllerAnimated:NO completion:nil]

[迅速]

  self.presentingViewController?.dismiss(animated: false, completion:nil)
于 2013-01-31T23:29:22.513 に答える
54

これは、View Controller の再利用性のためです。

ビューコントローラーは、モーダルとして表示されているか、ナビゲーションコントローラーにプッシュされているかなどを気にする必要はありません。ビューコントローラーがそれ自体を閉じる場合、モーダルに表示されていると想定しています。そのビュー コントローラーをナビゲーション コントローラーにプッシュすることはできません。

プロトコルを実装することで、親のビュー コントローラーが表示/プッシュおよび破棄/ポップの方法を決定できるようになります。

于 2014-07-11T03:19:15.927 に答える
6

私の経験では、必要なViewControllerからそれを却下し、それを却下するViewControllerごとに異なるタスクを実行する必要がある場合に便利です。プロトコルを採用する viewController は、独自の方法でビューを閉じることができます。(iPad と iPhone、または異なるビューから閉じるときに異なるデータを渡す、閉じるときに異なるメソッドを呼び出すなど)

編集:

したがって、明確にするために、ビューを閉じることだけが必要な場合は、デリゲート プロトコルをセットアップする必要はないと思います。別の表示ビュー コントローラーから閉じたに別のことを行う必要がある場合は、デリゲートを使用するのが最善の方法です。

于 2013-01-31T23:17:35.950 に答える
2

1 つのポイントは、これが優れたコーディング手法であるということです。OOPSRP、関心の分離など、多くの原則を満たしています。

そのため、ビューを表示するビュー コントローラーは、それを閉じるものでなければなりません。

同様に、賃貸住宅を提供する不動産会社は、それを取り戻す権限を持つべきです。

于 2015-05-14T09:33:47.430 に答える
2

View Controller Programming Guideからの引用、「How View Controllers Present Other View Controllers」。

表示されたビュー コントローラーのチェーン内の各ビュー コントローラーには、チェーン内でそれを囲む他のオブジェクトへのポインターがあります。つまり、別のView Controllerを提示するPresented View Controllerは、presentingViewControllerとpresentedViewControllerの両方のプロパティに有効なオブジェクトを持っています。これらの関係を使用して、必要に応じてビュー コントローラーのチェーンをトレースできます。たとえば、ユーザーが現在の操作をキャンセルした場合、最初に表示されたビュー コントローラーを閉じることで、チェーン内のすべてのオブジェクトを削除できます。ビュー コントローラーを閉じると、そのビュー コントローラーだけでなく、表示されたすべてのビュー コントローラーも閉じられます。

一方で、バランスの取れた優れた設計、優れたデカップリングなどを実現します。一方で、ナビゲーションの特定のポイントにすばやく戻ることができるため、非常に実用的です。

ただし、私は個人的には、表示中のビュー コントローラーツリーを逆方向にたどろうとするよりも、セグエの巻き戻しを使用したいと考えています。

于 2015-03-03T06:06:16.673 に答える
0

モーダル使用ビューを使用している場合は閉じます。

[self dismissViewControllerAnimated:NO completion:nil];
于 2014-12-16T16:28:06.683 に答える
0

これは非常にばかげています。委任は必要な場合は問題ありませんが、委任によってコードがより複雑になる場合は (実際にそうです)、それには理由が必要です。

Appleにはその理由があると確信しています。しかし、そうしない本当の理由がなく、今日の時点で私が見ることができるものを提示した人が誰もいない場合を除き、提示された VC に単に却下させる方がより明確で簡潔です。

プロトコルは必要なときに優れていますが、オブジェクト指向設計では、モジュールが互いに不必要に通信することは決してありませんでした。

Tom Love (Objective C の共同開発者) は、Objective C は (C++ と比較して) "エレガント"、"小さい"、"鮮明"、"明確に定義されている" とコメントしました。彼が言うのは簡単です。デリゲーションは便利な機能であり、「ただの理由で」過剰に使用されているようです。私はこの言語で作業するのが好きですが、不要な構文を使用して物事を必要以上に複雑にすることを余儀なくされるという考えを恐れています。

于 2016-02-05T02:56:53.500 に答える