Notes d'étude: addChildViewController

Study Notes Addchildviewcontroller



En parlant de cela, Apple a fourni la méthode addChildViewController dans iOS5, mais je ne l'ai jamais utilisée et je n'en sais pas grand-chose. J'ai l'opportunité de l'utiliser et de l'apprendre attentivement.

Définition de la méthode

Dans Swift, la méthode correspondante est:



/* 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)

Explication d'Apple de cette méthode:



Cette méthode crée une relation parent-enfant entre le contrôleur de vue actuel et l'objet dans le paramètre childController. Cette relation est nécessaire lors de l'incorporation de la vue du contrôleur de vue enfant dans le contenu du contrôleur de vue actuel. Si le nouveau contrôleur de vue enfant est déjà l'enfant d'un contrôleur de vue de conteneur, il est supprimé de ce conteneur avant d'être ajouté.
Cette méthode est uniquement destinée à être appelée par une implémentation d'un contrôleur de vue de conteneur personnalisé. Si vous remplacez cette méthode, vous devez appeler super dans votre implémentation.

L'idée générale est:
Cette méthode crée une relation parent-enfant entre le VC actuel et le VC ajouté. Lors de l'ajout d'une vue VC à la vue VC actuelle, vous devez d'abord ajouter cette relation parent-enfant à l'aide de la méthode addChild. Si le VC enfant a déjà un VC parent, l'appel de cette méthode supprimera d'abord le VC enfant du VC parent précédent, puis l'ajoutera au VC actuel en tant que VC enfant.
Cette méthode ne sera appelée que dans un VC personnalisé. Si vous avez l'intention de remplacer cette méthode, vous devez appeler cette méthode de super.



En d'autres termes, l'API iOS5 d'Apple ajoute la méthode addChild (_ childController: UIViewController) et espère que lorsque nous utilisons addSubview, nous appelons également la méthode addChild (vc) pour ajouter le viewController correspondant à la sous-vue à la gestion actuelle de ViewController.
Pour les sous-vues qui n'ont pas besoin d'être affichées actuellement, ajoutez subViewController uniquement via addChild (_ childController: UIViewController), appelez la méthode transitionFromViewController lorsqu'elle doit être affichée. Ajoutez-le au ViewController sous-jacent.
Les avantages de faire ceci:

1. Sans aucun doute, la logique de la page est plus distincte. La vue correspondante correspond au ViewController correspondant.
2. Lorsqu'une sous-vue n'est pas affichée, elle ne sera pas chargée, ce qui réduit l'utilisation de la mémoire.
3. Lorsque la mémoire est insuffisante, la vue sans charge sera libérée en premier, optimisant le mécanisme de libération de la mémoire du programme.

  • Dans iOS5, les méthodes suivantes ont été ajoutées au ViewController:
  • addChildViewController:
  • removeFromParentViewController
  • transitionFromViewController: toViewController: durée: options: animations: achèvement:
  • willMoveToParentViewController:
  • didMoveToParentViewController:
scènes à utiliser:

Dans notre développement quotidien, il est souvent nécessaire de basculer entre les différentes pages en changeant d'onglet. Si vous gérez ces vues dans un contrôleur, le code semble trop couplé et ne correspond pas au modèle MVC d'Apple. Apple recommande un contrôleur. Gérez une vue. Certaines personnes suggèrent que la méthode comme [self.view addSubview: viewController.view] est contrôlée par un autre contrôleur, mais cela créera un nouveau problème: la sous-vue ajoutée directement dans la hiérarchie des vues du viewController ne sera pas transmise normalement. Tels que: la rotation, le toucher, etc., est une opération dangereuse contre le principe de conception MVC développé par CocoaTouch, viewController devrait et ne devrait gérer qu'une hiérarchie de vues. De même, nous devons considérer un autre problème: la plupart de ces sous-vues ne seront pas toujours sur l'interface, mais n'apparaîtront que dans certains cas, tels que la vue rapide de l'échec de connexion, la vue rapide de téléchargement de la pièce jointe avec succès et l'invite vue de l'échec du réseau. Attendre. Mais bien que ces vues soient rares, nous les gardons souvent en mémoire.



À propos du cycle de vie de l'enfant VC:

Lorsque le childViewController n'est ajouté à aucun contrôleur de vue parent, si la vue du childViewController est ajoutée à une autre vue, viewWillAppear et viewDidAppear seront appelés normalement. Mais lorsque le childViewController est ajouté à un contrôleur de vue parent, viewWillAppear et viewDidAppear sont synchronisés avec les événements viewWillAppear et viewDidAppear du contrôleur de vue parent.

Appelez donc les questions suivantes auxquelles prêter attention:

Appelez d'abord addSubView, viewWillAppear et viewDidAppear seront appelés une fois, puis addChildViewController, synchronisé avec l'événement du contrôleur de vue parent, c'est-à-dire que lorsque le viewDidAppear du contrôleur de vue parent est appelé, la méthode viewDidAppear du childViewController sera appelée à nouveau. La méthode viewDidAppear est donc appelée deux fois.

Premier appel à addChildViewController, l'événement childViewController est synchronisé avec le contrôleur de vue parent. Lorsque le contrôleur de vue parent viewDidAppear est appelé, la méthode viewDidAppear du childViewController sera appelée une fois, puis l'appel addSubView ne déclenchera pas viewWillAppear et viewDidAppear.