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

Posted

技术标签:

【中文标题】将数据传递给不是前一个 VC 的 VC【英文标题】:Pass data to VC that is not the previous VC 【发布时间】:2016-09-15 15:00:08 【问题描述】:

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

当我从 VC1-> NavVC->VC2-> VC3 去时。当 VC3 被关闭时,会显示 VC1。我希望能够将数据传回 VC1 并在 VC1 中启动一些功能。例如,我有一个要在 VC3 中上传的图像。一旦 VC3 被解雇,我希望在 VC1 中有一个函数,例如以下函数,其中图像是来自 VC3 的数据

func uploadInitiate(image: UIImage) 

三个VC的关系

VC1 是普通的 VC。它通过

呈现VC2
let navController = UINavigationController.init(rootViewController: VC2)
self.navigationController?.presentViewController(navController, animated: true, completion: nil)

VC2 是一个来自 cocoapods 的自定义 FusumaCamera 照片选择器。 选择图像后,我通过所选图像进入 VC3

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

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

【问题讨论】:

您可以使用相同的模式,让 VC1 符合某些协议,然后将引用传递给 VC2,然后将其传递给 VC3。或者,如果您真的要从 VC3 转到 VC1,请使用展开转场从 VC3 转到 VC1,然后使用 prepareForSegue 将数据传回。 这里有什么关系? VC1 是否期望 VC2 最终会得到一个图像? VC3 只是被 VC2 用来帮助获取图像吗? @rmaddy,问题已更新以解决您的回复。谢谢 鉴于此,我同意@Rob。像往常一样使用代表。 VC3 将图像传给 VC2 后,VC2 将图像传给 VC1。 成功了!在 VC3 和 VC2 中都有协议,实现起来又快又容易。再次感谢@Rob 和 rmaddy 【参考方案1】:

您有多种模式可以应用于类似情况。我将使用代表团(推荐)示例。想象一下你有 VC1-> 它以模态方式将 UINavigationController 呈现为根控制器,并从那里 VC2 将 VC3 推送到堆栈。您必须定义多个将在您关闭 VC3 时调用的协议

protocol DismissVCDelegate : class 
    func dismissViewAndStartUpload(shouldUpload: Bool)

然后存储属性:

weak var delegate: DismissVCDelegate!

当您从 VC2 推送它并符合您在 VC2 中定义的协议时,将委托设置为 VC3。 将相同的模式一直应用到 VC1,您已经多次传递协议,您可以开始上传任务,您应该像这样关闭模态呈现的导航控制器:

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

【讨论】:

为什么叫self.presentedViewController.dismissViewControllerAnimated而不是self.dismissViewControllerAnimated 我正在从 VC1 调用 self.presentedViewController,您已经在其中实现了从 VC3 到 VC2 一直传递到 VC1 的委托方法。在调用 VC1 中的委托并从那里解散后,您想解散 VC3。 (希望这对您有所帮助!) 哇哦,我刚试过。这是一种有趣的方法。我最初所做的(并且工作的)是在 VC3 btn press 中有dismissViewController。我想知道这样做是否有任何优势?我认为从你所在的 VC 中解雇会更合乎逻辑吗?还是不是? 那样做可不是个好主意。在大多数情况下,您从 self 调用dismissViewControllerAnimated,但是在这种情况下,您最好从 VC1 中调用。确保按照我在示例和协议 DismissVCDelegate 中发布的方式实现您的协议:通过关闭 VC 将它们分类并存储为弱属性,您实际上将释放 VC2 和 VC3 有时很容易使用委托进行保留循环。 明白了!非常感谢您的帮助:) 从这个问题中学到了很多新东西

以上是关于将数据传递给不是前一个 VC 的 VC的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift:查询完成后将数据传递给其他 VC 的最佳方式

Swift:如何将数据传递给嵌入在 ContainerView 中的 PageViewController?

在传递数据时向后滑动以关闭子 VC

在不同的 ViewController 之间将数据传递给数组

将数据从父 ViewController 传递到子 VC,无需故事板 - Swift 5

Swift:将数据传递给 segue