Ios 取消显示视图控制器时,显示视图控制器将出现调用视图的问题

Ios 取消显示视图控制器时,显示视图控制器将出现调用视图的问题,ios,uiviewcontroller,presentviewcontroller,Ios,Uiviewcontroller,Presentviewcontroller,我目前有一个基本视图控制器,如AVC,它在当前上下文中呈现另一个视图控制器,如BVC,如下所示: let bvc: BVC = sb.instantiateViewControllerWithIdentifier("BVC") as! BVC bvc.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext self.presentViewController(bvc, animated: true, complet

我目前有一个基本视图控制器,如AVC,它在当前上下文中呈现另一个视图控制器,如BVC,如下所示:

let bvc: BVC = sb.instantiateViewControllerWithIdentifier("BVC") as! BVC
bvc.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
self.presentViewController(bvc, animated: true, completion: nil)
然后,我在BVC中设置一个值,并在DISCLISE时,使用相同的值在AVC的VIEWWILLEXPEND中执行一个函数。但是,我注意到,在显示OverCurrentContext时,在dismise时,不会调用ViewWillEmbeen

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

谢谢

巴拉

两方面,

方式1

您可以为此使用委托和协议:)

在BVC中声明协议并在AVC中确认。当你在BVC中完成时,调用协议的方法,让AVC关闭BVC,这样你也可以将数据从BVC传递到AVC

例如:

在BVC中声明一个类似下面的协议

protocol letsCallParent{
    func amDoneHere(dataIwantToPass : String)
}
声明一个属性以保存BVC中确认此协议的view controller引用

var myParent : letsCallParent?
当您使用完BVC后,您必须在delegate中调用dismissViewController并传递要传递的数据:)现在,最好的编码实践是希望父级(AVC)解除BVC,而不是在self上调用dismissViewController:)

在AVC中,使用

class AVC: UIViewController,letsCallParent{
在呈现之前实例化BVC之后,将其自身指定为BVC的myParent:)

最后实现协议方法:)

方式2

使用展开序列:)使用展开序列将消除写入委托和协议的需要,并且所有:)还为父视图控制器提供了访问子视图控制器的机会:) 一旦您有权访问子VC(即BVC),您就可以从中读取数据:)

例如:

声明展开序列:) 如果希望BVC在AVC变小时调用AVC的metod,请在AVC中声明一个unwind segue方法:)

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

仅在声明此方法后:)转到您的故事板,选择BVC并按住控制键,然后从按钮或BVC中的任何其他视图中拖动以关闭它,退出BVC中的选项:)

请查看下面提供的gif以便清楚地理解:)

如果操作正确,您将看到您在AVC中声明的方法作为弹出选项出现:)选择它:)就是它:)每当您点击按钮或拖动控件退出的视图时,AVC中的方法将被调用:)

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

请注意,一旦您有权访问BVC的数据,就可以使用“
segue.sourceViewController
”)

希望我的回答有帮助:)

问题解释 正如您所注意到的,当呈现
过流上下文时,
视图将出现
,而不会在dismise时调用

为什么?
视图将出现
将在您返回视图时被调用(如果视图已消失)。当您使用
OverCurrentContext
显示新视图时,主视图仍会出现,并且您会在其上或其部分上显示新视图!弹出效果


由于这种逻辑,当您关闭
OverCurrentContext
视图时,
视图将出现
将不会被调用,您必须使用上述@Sandeep的任何方式手动处理该视图。

谢谢!var myParent不应该是AVC类型,而应该是LetScalParent类型吗,就像这个myParent:AVC?另外,在我的例子中,由于在我关闭BVC时并没有调用AVC的方法,我应该在哪里调用amDoneHere()来访问它?@shivam bhalla:根据你们的问题,var myParent不应该是AVC类型吗?不。BVC不需要知道它的父对象是AVC类型:)这将导致紧密耦合:)这意味着,如果任何其他viewcontroller让CVC呈现BVC,那么将您的委托myParent设置为AVC将导致错误:)您不想让delcare为每个view controller单独指定一个委托,不是吗?伙计:)根据您的第二个问题:)否当我解除BVC时,会调用AVC的方法,我在哪里调用amDoneHere()?:)你不叫amDoneHere()在AVC buddy:)你在BVC中调用它在myParent变量:)这将反过来触发AVC中的代码:)现在调用它的位置取决于你的程序逻辑:)假设你在BVC中有一个名为Dismise的按钮,当你点击它时,你必须关闭BVC:)在这种情况下,在方法的iAction中只需调用parent.amDoneHere(“Hi am Done here”)如果您仍有疑问,请随时发表评论,好友:)更改为全屏,但不工作
class AVC: UIViewController,letsCallParent{
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)
}
@IBAction func cancelChildVC(segue:UIStoryboardSegue) {
        let childVC : SecondViewController = segue.sourceViewController as! SecondViewController
        print(childVC.name)
        self.dismissViewControllerAnimated(true, completion: nil)
}
let childVC : SecondViewController = segue.sourceViewController as! SecondViewController
print(childVC.name)
self.dismissViewControllerAnimated(true, completion: nil)