closures具有导航控制器的视图控制器并将值传递回主视图控制器

我有一个mainViewcontroller在一个button调用get mainViewcontroller我打电话dataviewcontrollerselect集合视图单元格中的任何项目。一旦用户select任何单元格。该特定的dataviewcontroller将解雇,而解雇它将有用户select的项目名称和它将显示在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) } 

现在我怎么能解决这个问题。我的viewcontroller是不dismising和值也不显示。

在此先感谢〜

我的build议是使用“UnwindSegue”技术,就像“PerformSegue”一样,所以你可以很容易地发回值,使用准备继续,并将回到主控制器。 这里是unwind segue的教程 。 或者你可以从谷歌find更多。

对于数据未显示的问题,问题在于以下情况:

 if let presenter = presentingViewController as? mainViewcontroller { presenter.SelectedName = selectedNamesss } 

这个条件永远不会是真的,因为presentationViewController总是一个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) 

试试这个,看看这是否有助于你:)