Problème lors de l'appel de viewWillAppear de la présentation du controller de vue lors de sa présentation.

J'ai actuellement un controller de vue de base dire AVC qui présente un autre controller de vue dire BVC sur le context actuel comme ceci:

let bvc: BVC = sb.instantiateViewControllerWithIdentifier("BVC") as! BVC bvc.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext self.presentViewController(bvc, animated: true, completion: nil) 

Ensuite, je mets une valeur dans BVC et sur le rejet, j'utilise la même valeur pour exécuter une fonction dans le viewWillAppear d'AVC. Cependant, j'ai remarqué que lors de la présentation de OverCurrentContext, en cas de rejet, viewWillAppear n'est pas appelé.

Comment puis-je réparer cela? J'ai besoin d'une vue présentée semi-transparente et donc besoin d'utiliser OverCurrentContext.

Merci!

bhalla,

Deux façons,

Way 1

Vous pouvez utiliser les delegates et le protocole pour cela ๐Ÿ™‚

Déclarer un protocole dans BVC et le confirmer dans AVC. Et quand vous avez terminé en BVC appelez la méthode de protocole et laissez l'AVC rejeter BVC et en faisant cela, vous pouvez également transmettre datatables de BVC à AVC.

Exemple :

Déclarer un protocole comme celui ci-dessous dans BVC

 protocol letsCallParent{ func amDoneHere(dataIwantToPass : Ssortingng) } 

Déclarer une propriété pour contenir la reference du controller de vue confirmant ce protocole dans BVC

 var myParent : letsCallParent? 

Et quand vous avez terminé avec BVC et vous devez vous écarter vous appelez la méthode en déléguer et transmettre datatables que vous voulez passer ๐Ÿ™‚ Maintenant, il serait bon de coder pratique pour attendre le parent (AVC) de rejeter BVC plutôt que d'appeler dismissViewController sur soi ๐Ÿ™‚

 if let parent = myParent { parent.amDoneHere("Hi am Done here") } 

En AVC confirmer au protocole en utilisant

 class AVC: UIViewController,letsCallParent{ 

et après avoir instancié BVC avant de le présenter, assignez le moi comme myParent de BVC ๐Ÿ™‚

 let bvc: BVC = sb.instantiateViewControllerWithIdentifier("BVC") as! BVC bvc.myParent = self 

et enfin mettre en œuvre la méthode de protocole ๐Ÿ™‚

 func amDoneHere(dataIwantToPass: Ssortingng) { print("\(dataIwantToPass)") //if you want to dismiss BVC call //if you have pushed bvc //self.navigationController?.popToViewController(self, animated: true) //if you have presented //self.dismissViewControllerAnimated(true, completion: nil) } 

WAY 2

Faire usage de se détendre segue ๐Ÿ™‚ l'utilisation de se dérouler segue éliminera le besoin d'écrire délégué et les protocoles et tous ๐Ÿ™‚ fournit également au controller de vue parent une possibilité d'accéder au controller de vue enfant aussi bien ๐Ÿ™‚ Une fois que vous avez un access à l'enfant VC qui est BVC vous pouvez lire datatables de celui-ci ๐Ÿ™‚

Exemple :

Déclarer un segue dérouler ๐Ÿ™‚ Si vous voulez que BVC appelle une méthode d'AVC quand elle est affaiblie, déclarez une méthode de déroulement de segue dans AVC ๐Ÿ™‚

 @IBAction func cancelChildVC(segue:UIStoryboardSegue) { let childVC : SecondViewController = segue.sourceViewController as! SecondViewController print(childVC.name) self.dismissViewControllerAnimated(true, completion: nil) } 

La signature de la méthode est fixe ๐Ÿ™‚ Il doit s'agir d'une @IBAction et elle doit accepter segue comme paramètre ๐Ÿ™‚

Seulement après avoir déclaré cette méthode ๐Ÿ™‚ aller à votre story-board et select le BVC et maintenez le contrôle et faites glisser à partir du button ou de toute autre vue que vous avez dans BVC pour le rejeter, à l'option Quitter dans BVC ๐Ÿ™‚

Regardez gif ci-dessous pour une compréhension claire ๐Ÿ™‚

entrez la description de l'image ici

Si vous le faites correctement, vous verrez la méthode que vous avez déclaré dans AVC à venir comme option pop-up ๐Ÿ™‚ select-le ๐Ÿ™‚ C'est-à-dire ๐Ÿ™‚ Chaque fois que vous appuyez sur le button ou la vue à partir de laquelle vous avez fait glisser le contrôle vers Exit , la méthode dans votre AVC s'appelle ๐Ÿ™‚

Dans la méthode AVC, vous pouvez accéder à l'instance BVC parce que maintenant vous avez l'access à l'instance de segue ๐Ÿ™‚ souvenez-vous de la méthode prepareForSegue pour les segues directes, ceci est similaire à celui de segue segue ๐Ÿ™‚

 let childVC : SecondViewController = segue.sourceViewController as! SecondViewController print(childVC.name) self.dismissViewControllerAnimated(true, completion: nil) 

Notez l'utilisation de " segue.sourceViewController " une fois que vous avez l'access à BVC accéder à ses données ๐Ÿ™‚

J'espère que ma réponse a aidé ๐Ÿ™‚