Ios 将数据传递给不是上一个VC的VC

Ios 将数据传递给不是上一个VC的VC,ios,swift,Ios,Swift,当我从VC1转到VC2时,如果VC2被解除,我可以通过在VC2中设置protocal轻松地将数据传递回VC1,并使VC1符合它。但是,我想做一些类似的事情,但有以下区别 当我从VC1->NavVC->VC2->VC3开始。当VC3被解除时,将显示VC1。我希望能够将数据传递回VC1,并在VC1中启动一些功能。例如,我有一个图像上传到VC3。一旦VC3被解除,我希望在VC1中有一个函数,比如下面的函数,其中图像是来自VC3的数据 func uploadInitiate(image: UIImage

当我从VC1转到VC2时,如果VC2被解除,我可以通过在VC2中设置protocal轻松地将数据传递回VC1,并使VC1符合它。但是,我想做一些类似的事情,但有以下区别

当我从VC1->NavVC->VC2->VC3开始。当VC3被解除时,将显示VC1。我希望能够将数据传递回VC1,并在VC1中启动一些功能。例如,我有一个图像上传到VC3。一旦VC3被解除,我希望在VC1中有一个函数,比如下面的函数,其中图像是来自VC3的数据

func uploadInitiate(image: UIImage) {}
三者的关系

VC1是正常的VC。它通过

let navController = UINavigationController.init(rootViewController: VC2)
self.navigationController?.presentViewController(navController, animated: true, completion: nil)
VC2是cocoapods定制的FusumaCamera照片采集器。 一旦选择了图像,我将通过

self.navigationController!.pushViewController(postVC, animated: true)

在VC3中,我允许用户与图像交互、发表评论并按下按钮上传到服务器。我想在按下按钮后立即关闭VC,并允许VC1使用来自VC3的数据启动上载(这样我可以在导航栏下有一个进度条或在那里显示任何警告)

您可以在类似情况下应用多个模式。我将以代表团(推荐)为例。假设您有VC1-> 它以根控制器的形式呈现UINavigationController,并从那里VC2将VC3推送到堆栈。您必须定义多个协议,这些协议将在您关闭VC3时被调用

protocol DismissVCDelegate : class {
    func dismissViewAndStartUpload(shouldUpload: Bool)
}
然后存储属性:

weak var delegate: DismissVCDelegate!
将代理从VC2推送到VC3时进行设置,并遵守VC2中定义的协议。 将相同的模式一直应用到VC1,在VC1中,您已多次通过协议返回,您可以开始上载任务,您应该像这样关闭模式显示的导航控制器:

func dismissViewAndStartUpload(shouldUpload: Bool) {
     self.presentedViewController.dismissViewControllerAnimated(true, completion: nil)}

您可以使用相同的模式,使VC1符合某些协议,然后将引用传递给VC2,然后再将其传递给VC3。或者,如果您真的要从VC3转到VC1,请使用展开序列从VC3转到VC1,然后使用
prepareForSegue
将数据传回。这里的关系是什么?VC1呈现VC2时是否期望最终得到一个图像?VC3只是被VC2用来帮助获取图像吗?@rmaddy,问题已更新以解决您的回答。谢谢,我同意@Rob的观点。像往常一样使用代理。VC3将图像传递给VC2后,VC2将图像传递给VC1。这很有效!在VC3和VC2中都有协议是快速且易于实现的。再次感谢@Rob and rmaddyWhy您为什么调用self.presentedViewController.dismissViewControllerAnimated而不是self.dismissViewControllerAnimated我正在从VC1调用self.PresentedViewControllerAnimated,您在VC1中实现了从VC3传递到VC2再返回VC1的委托方法。在调用VC1中的代理并从中退出后,您希望退出VC3。(希望这对你有帮助!)哦,哇,我刚试过。这是一个有趣的方法。我最初做的(和工作)是在VC3 btn press中使用dismissViewController。我想知道这样做是否有任何好处?我认为从你所在的风投中撤职更合乎逻辑?还是不是?那样做不是个好主意。在大多数情况下,您可以从self调用dismissViewControllerAnimated,但是在这种情况下,您最好从VC1执行此操作。确保您按照我在示例中发布的方式实现协议,并且协议DismissVCDelegate:class并通过解除VC将它们存储为弱属性。实际上,您将释放VC2和VC3。有时使用委托进行保留循环很容易。明白了!非常感谢你的帮助:)从这个问题中学到了很多新东西