我目前有一个基本视图控制器说AVC,它提供另一个视图控制器说BVC在当前上下文中如下:
let bvc: BVC = sb.instantiateViewControllerWithIdentifier("BVC") as! BVC
bvc.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
self.presentViewController(bvc, animated: true, completion: nil)
然后我在BVC和dismiss中设置一个值,使用相同的值在AVC的viewWillAppear中执行一个函数。但是,我注意到在提示OverCurrentContext时,在关闭时,viewWillAppear不会被调用。
我该如何解决这个问题?我需要一个半透明的呈现视图,因此需要使用OverCurrentContext。
谢谢!
答案 0 :(得分:6)
巴拉,
两种方式,
方式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,您就可以从中读取数据:)
示例:
声明一个解开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作为参数:)
只有在声明此方法后:)转到你的故事板并选择BVC并按住控制并从按钮或你在BVC中的任何其他视图中删除它以解除它,在BVC中退出选项:)
请查看下面提供的gif以便清楚了解:)
如果你正确地做了,你会看到你在AVC中声明的方法即将弹出选项:)选择它:)这就是它:)每当你点击按钮或你拖动的视图控制到退出,AVC中的方法被调用:)
在AVC的方法中,您可以访问BVC实例,因为现在您可以访问segue实例:)记住直接segues的prepareForSegue方法,这类似于unwind segue:)
let childVC : SecondViewController = segue.sourceViewController as! SecondViewController
print(childVC.name)
self.dismissViewControllerAnimated(true, completion: nil)
在您访问BVC访问其数据后,请注意“segue.sourceViewController
”的用法:)
希望我的回答有所帮助:)
答案 1 :(得分:1)
如您所见,在演示OverCurrentContext
时,viewWillAppear
不会在解散时被调用。
viewWillAppear
(如果视图已经消失)。当您使用OverCurrentContext
呈现新视图时,主视图仍会出现,并且您会在其上或其中的一部分上呈现一个新视图!弹出效果!
由于这种逻辑,当您关闭viewWillAppear
视图时,OverCurrentContext
将不会被调用,并且您必须使用类似于@Sandeep的任何方式来手动处理它。