我目前有一个基本的视图控制器说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时,在关闭时,不会调用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将消除编写委托和协议的需要,并且所有:)还为父视图控制器提供了访问子视图控制器的机会:)
一旦可以访问作为BVC的子VC,就可以从中读取数据了:)
范例:
声明一个放松的话题:)
如果您希望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作为参数:)
仅在声明了此方法之后:)转到故事板,选择BVC并按住控件,然后从按钮或BVC中具有的其他任何视图中将其关闭以将其关闭,然后拖动到BVC中的Exit选项:)
请看下面提供的gif,以便清楚理解:)
如果操作正确,您将看到在AVC中声明的方法作为弹出选项出现:)选择它:)就这样:)每当您单击按钮或将控件拖到其中的视图时, ,您的AVC中的方法将被调用:)
在AVC的方法中,您可以访问BVC实例,因为现在您可以访问segue实例了:)对于直接segues,请记住prepareForSegue方法,这与对unsege segue的方法类似:)
let childVC : SecondViewController = segue.sourceViewController as! SecondViewController
print(childVC.name)
self.dismissViewControllerAnimated(true, completion: nil)
注意,一旦您具有BVC访问其数据的权限,就可以使用
segue.sourceViewController
:)希望我的回答有所帮助:)