8

リファクタリングが必要なコードを使用しています。ビューコントローラは、他の2つのビューコントローラのコンテナとして機能しており、以下のコードに示すように、それらの間でスワップします。

これは最良の設計ではないかもしれません。この方法でViewControllerを交換する必要はない場合があります。という事は承知しています。ただし、このコードを使用するときは、addChildViewController呼び出しで何が起こるかをさらに理解したいと思います。私はAppleのドキュメントや関連する質問で答えを見つけることができませんでした(おそらくデザインを変更する必要があることを示しています)。

具体的には、コンテナビューコントローラは、すでに追加されている子ビューコントローラを追加するように求められる状況をどのように処理しますか?そのViewControllerオブジェクトがすでに追加されていることを認識していますか?

たとえば、以下のコードがメソッド内にあり、そのメソッドが2回呼び出された場合...

[self addChildViewController:viewControllerB];
[self.view addSubview:viewControllerB.view];
[viewControllerB didMoveToParentViewController:self];

[viewControllerA willMoveToParentViewController:nil];
[viewControllerA.view removeFromSuperview];
[viewControllerA removeFromParentViewController];

ありがとう、ギャビン

4

1 に答える 1

7

一般に、ビューコントローラの「封じ込め」に関するガイドラインは、あるものが別のものを含む場合、封じ込めを実装する必要があるかどうかを判断するために従う必要があります。

特に、同じ子View Controllerを2回追加することを心配することは、同じViewControllerを2回提示することを心配することと同じです。あなたが本当に物事を熟考したならば、あなたはその問題に直面する必要はないはずです。あなたの勘は正しいです。

私は、Appleのドキュメントが、奇妙なパラメータで何が起こるか、または順序が狂って呼び出されたときに何が起こるかについてより前向きにすべきであることに同意しますが、将来的に問題を引き起こすエラー訂正設計に縛られたくない場合もあります。これらのメソッドを間違った方法で呼び出さない設計を作成する場合、問題を正しく解決し、エラー訂正が行われるかどうかに関係なく、それを考慮するとさらに重要になります。文書化されているように、そのエラー訂正は将来異なる動作をし、アプリを壊す可能性があります。

さらに少し進んで、Appleのコンテナビューコントローラが無効な状態になることができないことに気付くでしょう(少なくともパブリックAPIでは簡単ではありません)。を使用するUITabViewControllerと、あるビューコントローラから別のビューコントローラへの切り替えは不可分操作であり、タブビューコントローラはいつでも何が起こっているかを正確に認識します。これまでにやらなければならないことのほとんどは、アクティブなものを削除して新しいものを表示することです。すべてを水から吹き飛ばすのは、「すべてを水から吹き飛ばして、代わりにこれらのViewControllerの使用を開始する必要がある」と言ったときだけです。

すべてのビューやすべてのビューコントローラーを削除するなど、他のコーディングは、場合によっては便利または堅牢に見えるかもしれませんが、実際にはコードの一方の端がコードのもう一方の端を信頼していないため、まったく逆です。取引のその部分。それが実際にあなたを助けるどんな状況でも、それはあなたが望むべきコントロールなしで人々にビューコントローラーを意地悪に追加させることを意味します、そしてその場合、それはあなたが修正すべき問題です。

于 2012-10-02T07:54:16.497 に答える