将数据传递给不是前一个 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。它通过
呈现VC2let 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?
在不同的 ViewController 之间将数据传递给数组