【问题标题】:Passing same variable to container view with different value将相同的变量传递给具有不同值的容器视图
【发布时间】:2018-06-01 18:57:43
【问题描述】:

我在主 viewController 上有一个按钮,其默认值 nildropDown pod 关联。 在同一个viewController 上还有一个容器视图。

在第一次加载时,我从共享首选项中获取变量的默认值,并将该值通过performSegue 传递给容器视图。

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
   if(segue.identifier == "dataToContainerView"){
    DispatchQueue.main.async {

   var secondVC = segue.destination as! secondViewController //container viewController
        secondVC.variable = self.variable  
    }
  }
}

现在我需要通过用户从dropdown 按钮中选择来再次传递相同变量的值。

 dropDown.selectionAction = { [unowned self] (index, item) in
        self.button.setTitle(item, for: UIControlState())
        self.variable = item
        print(item)
        self.performSegue(withIdentifier: "dataToContainerView", sender: nil)
  //performing segue to resend the new value of the variable.
    }

上述代码在print(item) 之前正常运行。 但是我在 performSegue 上收到以下错误。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'There are unexpected subviews in the container view. Perhaps the embed segue has already fired once or a subview was added programmatically?

我应该如何在dropDown pod 的帮助下将值第二次覆盖第一个值传递给容器视图?

更新:- 我需要变量值,以便我可以将它传递给容器 viewController 上的 json 解析器。并且容器 viewController 上的代码重新执行。

【问题讨论】:

  • 你可以通过委托传递它。
  • 你不能这样做,正如错误所说的那样。一种解决方案是设置自定义闭包或使用委托。
  • @DharmeshKheni 请指导我或帮助我编写一些代码以找出解决方案

标签: ios swift dropdown uicontainerview


【解决方案1】:

您需要保存对嵌入式控制器的引用,以便以后再次更新它。在第一个 segue 中执行此操作:

// Declare a local variable in your parent container:
var secondVC: secondViewController!

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if(segue.identifier == "dataToContainerView"){
        DispatchQueue.main.async {
            self.secondVC = segue.destination as! secondViewController 
            //container viewController
            self.secondVC.variable = self.variable  
        }
    }
}

然后当您需要更新变量时,您可以直接引用它:

self.secondVC.variable = self.variable
self.secondVC.viewDidLoad()

【讨论】:

  • 我这样做了,但是我的容器视图没有用第二个值刷新(我再次通过 segue 的原因)。实际上,我在容器视图中的 Json 解析器中传递了这个值。它不会执行容器 viewController 上的代码。请检查更新的问题先生。
  • 您在第二个视图中是否有要调用以刷新值的函数?请更新您的代码以显示处理 JSON 值的 secondVC 中的代码。每次更改变量时,您必须确保再次调用该函数。
  • 是的,容器ViewController上有功能。它需要 4 个变量,3 个来自同一个 viewController,1 个来自主 viewController。当我执行 segue 时,它​​第一次运行。因此,如果您能在第二次赋值后帮助我如何再次执行该功能,将解决我的问题。
  • 得到了答案。我只需要添加self.secondVC.viewDidLoad()。如果您可以在上面的代码中添加它。我会将其标记为答案。
  • 好的,我已经更新了我的答案以显示调用 viewDidLoad()
猜你喜欢
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
相关资源
最近更新 更多