调用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
”的用法:)
希望我的回答帮助:)