无法从 non-parent VC 更新嵌入的 child VC

Cannot update embedded child VC from non-parent VC

最新 Xcode/Swift/iOS。

我有一个 Master VC(称为 StartVC),它包含一个 Child VC(称为 TopBarVC)和嵌入式 segue。 Child VC 包含一个按钮,当按下该按钮时,它会模态地跳转到第三个 VC(称为 CategoryPickerOverlayVC)(此 VC 中的视图服务作为选择类别的下拉框)。

    @IBAction func CategoryFilterButtonPressed(_ sender: Any) {

    performSegue(withIdentifier: "toCategoryPickerOverlay", sender: self)

}

当从下拉框中选择一个选项时,下拉框本身由三个按钮组成,所选按钮的标题应该用于替换 Child [=48] 中按钮的标题文本=].

在 Master VC 中,我使用 prepareforsegue 将对 Child VC 的引用存储在一个变量中 - "topBarReference" - 在嵌入 segue 的那一刻发生。

 var topBarReference: TopBarVC?


    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {        
    if segue.identifier == "TopBarPane"{
        topBarReference = segue.destination as? TopBarVC
    }
}

然后,在第 3 个 VC 中,当我单击下拉框中的按钮选项之一时,按钮标题通过 prepareforsegue 发送以更新 Child 中的按钮 VC(通过"topBarReference")。

        if segue.identifier == "unwindToStartVC"{

        let vc = segue.destination as! StartVC

        vc.topBarReference?.filterButtonText = ((sender as! UIButton).titleLabel?.text)!

    }

第 3 个 VC 然后放松 segues 回到大师 VC。我应该补充一点,当 Child VC 中的按钮发生变化时, Child VC 中的一个变量(filterButtonText)首先设置为标题文本,然后这个变量是然后用于通过 Child VC.

的 viewDidAppear 方法设置按钮标题文本

当使用调试器时,我还注意到 Master VC 中的 viewDidAppear 在展开后似乎没有执行(我在 viewDidAppear 中放置了一个诊断 print-to-console 并且在展开转场后没有任何打印) .我意识到这可以解释按钮没有更新,但我不知道为什么 viewDidAppear 没有 运行.

我也尝试过使用委托协议和 instantiateViewController(withString:) 无济于事。所有方法都会产生相同的结果,即 Child VC 中的按钮不会更新。没有显示错误。其他一切都按预期发生。

关于我做错了什么有什么想法吗?

你的意思是这样的吗?

如果是,我使用的解决方案很简单:第三个VC使用prepareForSegue设置一个属性嵌入VC,嵌入VC 在 unwind 方法中选择 属性。

在我的实现中,三个视图控制器称为 ViewController、ChildViewController 和 ThirdViewController。这是 完整的 代码(其他所有内容都在情节提要中配置):

class ChildViewController: UIViewController {

    @IBOutlet weak var theButton: UIButton!
    var buttonTitle : String?

    @IBAction func unwind(_:UIStoryboardSegue) {
        self.theButton.setTitle(self.buttonTitle, for: .normal)
    }

}
class ThirdViewController: UIViewController {

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        (segue.destination as! ChildViewController).buttonTitle = (sender as! UIButton).currentTitle
    }

}

好的,所以我发现我的原始代码在 Child VC 的 prepareforsegue 中只有一行可以正常工作。如果我将 prepareforsegue 更改为:

        if segue.identifier == "unwindToStartVC"{

        let vc = segue.destination as! StartVC
        vc.topBarReference?.CategoryFilterButton.titleLabel?.text = ((sender as! UIButton).titleLabel?.text)!

    }

对此:

        if segue.identifier == "unwindToStartVC"{

        let vc = segue.destination as! StartVC
        vc.topBarReference?.CategoryFilterButton.setTitle((sender as! UIButton).titleLabel?.text, for: .normal)

    }

它工作得很好。 .setTitle 方法的使用似乎有所不同,但我不确定为什么。

感谢 Matt 给了我改成那个的想法。 Matt 的方法在我尝试时确实奏效了,但是,因为我正在向 Master VC 而不是 Child VC 放松,所以我不得不根据我放置它的位置相应地编辑代码。

由于我的小"discovery"相当于对原始代码的最小改动,我将其标记为答案。

感谢大家花时间回复!