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)
试试这个,看看这是否有助于你:)