关闭具有导航控制器的视图控制器并将值传递回主视图控制器
Posted
技术标签:
【中文标题】关闭具有导航控制器的视图控制器并将值传递回主视图控制器【英文标题】:Dismiss the view controller which have navigation controller and pass the value back to main view controller 【发布时间】:2017-10-27 13:32:43 【问题描述】:我在那个名为 get value 的按钮中有一个 mainViewcontroller
。然后我调用 dataviewcontroller
选择集合视图单元格中的任何项目。一旦用户选择任何单元格。那个特定的 dataviewcontroller
将关闭并关闭它将有用户选择的项目名称,它将显示在 mainViewcontroller
中。现在视图控制器不会关闭。
这里是代码:
在我的mainViewcontroller
:
var SelectedName: String? = ""
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
currentTF.text = SelectedName
现在dataviewcontroller
:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
if collectionView.cellForItem(at: indexPath) != nil
selectedNamesss = allitems[indexPath.row] as String
calldismiss()
print(selectedNamesss)
func calldismiss()
if let presenter = presentingViewController as? mainViewcontroller
presenter.SelectedName = selectedNamesss
dismiss(animated: true, completion: nil)
现在我该如何解决这个问题。我的视图控制器没有消失,值也没有显示。
提前致谢~
【问题讨论】:
【参考方案1】:我的建议是使用“UnwindSegue”技术,它的工作原理类似于“PerformSegue”,因此您可以使用prepare for segue 非常轻松地将值发送回主控制器。 Here is tutorial for unwind segue。或者你可以从谷歌找到更多。
【讨论】:
【参考方案2】:对于数据未显示的问题,问题在于这种情况:
if let presenter = presentingViewController as? mainViewcontroller
presenter.SelectedName = selectedNamesss
这个条件永远不会成立,因为presentingViewController 总是一个UINavigationController。所以你需要改变它可能是这样的:
if let presenter = (presentingViewController as! UINavigationController).viewControllers.first! as? mainViewcontroller
presenter.SelectedName = name
我在这里使用 viewControllers.first!条件为 mainViewcontroller 是 viewControllers 数组的第一个索引。检查 viewControllers 数组,找到 mainViewcontroller 的索引并进行相应的更改。
我进行了这些更改,并且代码对我有用。我在 mainViewcontroller 上获得了选定的名称。
我还想提一下,这不是向后传输数据的正确方法。您可以使用委托、块或展开 segue 来实现此目的。
虽然这是有效的,但我附上了一个 gif 来展示这个工作。
关于您的控制器没有被解雇的问题,我以以下方式展示控制器:
let dataVC = self.storyboard?.instantiateViewController(withIdentifier: "dataviewcontroller") as! dataviewcontroller
self.present(vc, animated: true, completion: nil)
试试这个,看看是否对你有帮助:)
【讨论】:
这一行是否正确`dismiss(animated: true, completion: nil)` 是的,这是正确的,我正在使用相同的代码将其解雇let storyboard = UIStoryboard(name: "DashBoard", bundle: nil) let destinationVc = storyboard.instantiateViewController(withIdentifier: "NewVC") self.navigationController?.pushViewController(destinationVc, animated: true)
我正在做推送导航...因为我在数据视图控制器的导航栏中使用了一些图像
哦,伙计,您正在推动视图控制器,那么它将如何关闭?我已经更新了关于如何呈现控制器的答案。呈现控制器使用 self.navigationController?.present(destinationVc, animated: true, completion: nil)以上是关于关闭具有导航控制器的视图控制器并将值传递回主视图控制器的主要内容,如果未能解决你的问题,请参考以下文章