调用viewWill时出现的视图控制器出现问题时出现的问题被驳回

我目前有一个基础视图控制器说AVC提出了另一个视图控制器说BVC在当前上下文是这样的:

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

然后我在BVC中设置一个值,并且在AVC的viewWillAppear中使用相同的值执行一个函数。 不过,我注意到,当呈现OverCurrentContext,closures,viewWillAppear不会调用。

我如何去解决这个问题? 我需要一个半透明的呈现视图,因此需要使用OverCurrentContext。

谢谢!

布哈拉,

两种方式,

方法1

你可以使用代表和协议:)

在BVC中声明协议并在AVC中确认。 当你在BVC完成时,调用协议方法,让AVC解散BVC,这样你就可以将BVC的数据传递给AVC。

例如:

在BVC中声明如下所示的协议

 protocol letsCallParent{ func amDoneHere(dataIwantToPass : String) } 

声明一个属性来保存视图控制器的引用,在BVC中确认这个协议

 var myParent : letsCallParent? 

当你完成了BVC,你必须解雇你自己调用委托的方法,并传递你想传递的数据:)现在是期望父母(AVC)解雇BVC,而不是打电话给dismissViewController自我:)

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

在AVC确认使用的协议

 class AVC: UIViewController,letsCallParent{ 

并在呈现之前实例化BVC之后,将自己指定为BVC的myParent 🙂

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

最后实现协议方法:)

 func amDoneHere(dataIwantToPass: String) { 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) } 

方法2

使用unwind segue :)使用unwind segue将消除编写委托和协议以及所有的需要:)也为父视图控制器提供访问子视图控制器的机会:)一旦你有一个访问子VC是BVC,你可以从中读取数据:)

例如:

声明一个unwind segue :)如果你希望BVC在调用时调用AVC的方法,在AVC中声明一个unwind segue方法:)

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

该方法的签名是固定的:)它必须是@IBAction,它必须接受segue作为参数:)

只有在声明这种方法之后:)进入你的故事板并selectBVC并按住控制,并从button或BVC中的任何其他视图中拖动,将其解除,在BVC中退出选项:)

为了清楚理解,请看下面提供的gif 🙂

在这里输入图像说明

如果你做得正确,你会看到你在AVC中声明的方法popup选项:)select它:)多数民众赞成:)每当你点击button或视图,你已经将控制拖动到退出,你的AVC中的方法被称为:)

在AVC的方法中,您可以访问BVC实例,因为现在您可以访问segue实例了:)记住prepareForSegue方法直接segues,这与unwind segue相似:)

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

一旦你有权访问BVC的数据,请注意“ segue.sourceViewController ”的用法:)

希望我的回答帮助:)