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

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)

以上是关于关闭具有导航控制器的视图控制器并将值传递回主视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从第三个视图控制器传递回第一个视图控制器?

将值传递给导航视图控制器堆栈中的前一个视图控制器

将常量值和变量(输入)文本从视图传递到控制器

使用 IBAction 切换回主视图控制器

识别选择了哪个tableviewcell并将值传递给另一个视图控制器[重复]

如何使用 Swift 4.2 设置标志并将一些值从 Popup 呈现模型视图控制器传递到 Tabbar 主视图控制器?