研究ノート:addChildViewController



Study Notes Addchildviewcontroller



そういえば、AppleはiOS5でaddChildViewControllerメソッドを提供しましたが、私はそれを使ったことがなく、それについてあまり知りません。私はそれを使用して注意深く学ぶ機会があります。

メソッド定義

迅速に、対応する方法は次のとおりです。



/* If the child controller has a different parent controller, it will first be removed from its current parent by calling removeFromParentViewController. If this method is overridden then the super implementation must be called. The general idea is: if the added VC already has a parent VC, it will be removed from the parent VC before calling this method, and then added to the current VC as the child VC of the current VC. */ @available(iOS 5.0, *) open func addChild(_ childController: UIViewController)

この方法に関するAppleの説明:

このメソッドは、現在のViewControllerとchildControllerパラメーターのオブジェクトの間に親子関係を作成します。この関係は、子ViewControllerのビューを現在のViewControllerのコンテンツに埋め込むときに必要です。新しい子ViewControllerがすでにコンテナViewControllerの子である場合、追加される前にそのコンテナから削除されます。
このメソッドは、カスタムコンテナビューコントローラの実装によってのみ呼び出されることを目的としています。このメソッドをオーバーライドする場合は、実装でsuperを呼び出す必要があります。

一般的な考え方は次のとおりです。
このメソッドは、現在のVCと追加されたVCの間に親子関係を作成します。現在のVCビューにVCビューを追加するときは、最初にaddChildメソッドを使用してこの親子関係を追加する必要があります。子VCにすでに親VCがある場合、このメソッドを呼び出すと、最初に前の親VCから子VCが削除され、次に子VCとして現在のVCに追加されます。
このメソッドは、カスタムVCでのみ呼び出されます。このメソッドをオーバーライドする場合は、このスーパーメソッドを呼び出す必要があります。



言い換えると、AppleのiOS5 APIはaddChild(_ childController:UIViewController)メソッドを追加し、addSubviewを使用するときに、addChild(vc)メソッドも呼び出して、サブビューに対応するviewControllerを現在のViewController管理に追加することを期待しています。
現在表示する必要のないサブビューの場合、addChild(_ childController:UIViewController)を介してのみsubViewControllerを追加し、表示する必要があるときにtransitionFromViewControllerメソッドを呼び出します。基になるViewControllerに追加します。
これを行うことの利点:

1.間違いなく、ページのロジックはより明確です。対応するビューは、対応するViewControllerに対応します。
2.サブビューが表示されていない場合、サブビューはロードされないため、メモリの使用量が削減されます。
3.メモリが不足すると、ロードなしのビューが最初に解放され、プログラムのメモリ解放メカニズムが最適化されます。

  • iOS5では、次のメソッドがViewControllerに追加されました。
  • addChildViewController:
  • removeFromParentViewController
  • transitionFromViewController:toViewController:duration:options:animations:completion:
  • willMoveToParentViewController:
  • didMoveToParentViewController:
使用するシーン:

私たちの日々の開発では、タブを切り替えることによって異なるページを切り替える必要があることがよくあります。これらのビューをコントローラーで管理している場合、コードは結合しすぎているように見え、AppleのMVCパターンと一致しません。 Appleはコントローラーを推奨しています。ビューを管理します。 [self.view addSubview:viewController.view]のようなメソッドは別のコントローラーによって制御されると言う人もいますが、これは新しい問題を引き起こします。viewControllerのビュー階層に直接追加されたsubViewは正常に渡されません。回転、タッチなどは、CocoaTouchによって開発されたMVCの設計原則に対する危険な操作であり、viewControllerはビュー階層のみを管理する必要があります。同様に、別の問題を考慮する必要があります。これらのサブビューのほとんどは常にインターフェイス上にあるとは限りませんが、ログイン失敗のプロンプトビュー、添付ファイルの正常なアップロードのプロンプトビュー、プロンプトなど、一部の場合にのみ表示されます。ネットワーク障害のビュー。待つ。しかし、これらのビューはまれですが、私たちはしばしばそれらをメモリに保持します。



子VCのライフサイクルについて:

childViewControllerが親ViewControllerに追加されていない場合、childViewControllerのビューが別のビューに追加されると、viewWillAppearとviewDidAppearが通常どおり呼び出されます。ただし、childViewControllerが親View Controllerに追加されると、viewWillAppearおよびviewDidAppearは、親ViewControllerのviewWillAppearおよびviewDidAppearイベントと同期されます。

したがって、次の質問に注意を払ってください。

最初にaddSubView、viewWillAppear、viewDidAppearが1回呼び出され、次にaddChildViewControllerが親ビューコントローラーのイベントと同期されます。つまり、親ビューコントローラーのviewDidAppearが呼び出されると、childViewControllerのviewDidAppearメソッドが再度呼び出されます。したがって、viewDidAppearメソッドは2回呼び出されます。

最初にaddChildViewControllerを呼び出すと、childViewControllerのイベントが親ViewControllerと同期されます。親ビューコントローラーのviewDidAppearが呼び出されると、childViewControllerのviewDidAppearメソッドが1回呼び出され、その後addSubViewを呼び出してもviewWillAppearとviewDidAppearはトリガーされません。