调用viewWillAppear时显示视图控制器的问题被解除

时间:2016-04-22 06:15:28

标签: ios uiviewcontroller presentviewcontroller

我目前有一个基本视图控制器说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。

谢谢!

2 个答案:

答案 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以便清楚了解:)

enter image description here

如果你正确地做了,你会看到你在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的任何方式来手动处理它。