Swift:弹出视图控制器时如何传递数据

Posted

技术标签:

【中文标题】Swift:弹出视图控制器时如何传递数据【英文标题】:Swift: How to pass data when popping view controller 【发布时间】:2021-06-25 02:23:33 【问题描述】:

我想在弹出视图控制器时将数据从 childVC 传递到 parentVC。

ChildViewController /处理数据/ //获取数据值 值 = 123 self.navigationController?.popViewController(动画: 真的)

ParentViewController //使用来自子 vc(value 123) 的值

如何将数据传回以在 ParentViewController 中使用?

【问题讨论】:

您可以使用 segue ***.com/a/35314768/2303865,发布通知 ***.com/a/30541063/2303865 或使用委托 ***.com/a/60840590/2303865 【参考方案1】:

您可以使用转场,并在弹出新视图控制器之前为转场做好准备。

在 VC1 中

performSegue(withIdentifier: "toVC2", sender: self)

let dataInVC1 = "wow"

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "toVC2" 
        let vc = segue.destination as SecondViewController
         vc?.someData = dataInVC1

在 VC2 中

var someData: String?

【讨论】:

【参考方案2】:

最简单的方法是在子节点上使用回调闭包属性。设置子视图控制器时从父级设置它。当孩子完成后,检查回调是否为 != nil(如果是可选的),如果是,则在弹出之前调用它。

【讨论】:

【参考方案3】:

您还可以创建自定义处理程序以在弹出后完成。这是一个例子:

extension UINavigationController 

func popViewControllerWithHandler(animated:Bool = true, completion: @escaping ()->()) 
    CATransaction.begin()
    CATransaction.setCompletionBlock(completion)
    self.popViewController(animated: animated)
    CATransaction.commit()

【讨论】:

以上是关于Swift:弹出视图控制器时如何传递数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中的视图之间传递数据

swift 4 中使用 performSegue 打开的关闭页面时,如何在视图控制器和 TableViewController 之间传递数据?

如何在 Swift 中的视图控制器之间传递数据?

当使用在swift 4中使用performSegue打开的dismiss页面时,如何在视图控制器和TableViewController之间传递数据?

关于在用户查询后将数据从 API 传递到视图控制器的问题 - Swift

如何在swift 3中从一个视图控制器传递到上一个视图控制器时设置委托?