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 ๐
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é ๐