无法从非父VC更新嵌入式子VC

时间:2017-01-21 00:44:36

标签: ios swift xcode uicontainerview viewdidappear

最新的Xcode / Swift / iOS。

我有一个主VC(称为StartVC),它包含一个子VC(称为TopBarVC)和嵌入式segue。子VC包含一个按钮,当按下该按钮时,模态地分割为第三个VC(称为CategoryPickerOverlayVC)(此VC中的视图用作选择类别的下拉框)。

    @IBAction func CategoryFilterButtonPressed(_ sender: Any) {

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

}

如果从下拉框中选择了一个选项,该选项本身由三个按钮组成,则应使用所选按钮的标题替换子VC中按钮的标题文本。

在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)!

    }

第三个VC随后展开,然后再回到主VC。我应该补充一点,当改变Child VC中的按钮时,首先使用标题文本设置Child VC中的变量(filterButtonText),然后使用该变量通过Child VC的viewDidAppear方法设置按钮标题文本。

使用调试器时,我还注意到主VC中的viewDidAppear似乎在展开后没有执行(我在viewDidAppear中放置了诊断打印到控制台,并且在展开segue之后没有打印)。我意识到这可以解释按钮没有更新,但我不知道为什么viewDidAppear没有运行。

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

关于我做错了什么的想法?

2 个答案:

答案 0 :(得分:0)

你的意思是这样吗?

enter image description here

如果是这样,我使用的解决方案非常简单:第三个VC使用prepareForSegue设置嵌入式VC的属性,嵌入式VC在unwind方法中选择该属性。 / p>

在我的实现中,三个视图控制器称为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
    }

}

答案 1 :(得分:0)

好的,所以我发现我的原始代码在Child VC的prepareforsegue中排得很好。如果我从:

改变那个准备
        if segue.identifier == "unwindToStartVC"{

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

    }

到此:

debug

它运作得很好。使用.setTitle方法似乎有所不同,虽然我不确定原因。

感谢Matt让我改变它的想法。 Matt的方法在我尝试的时候确实有效,但是,当我解开Master VC而不是Child VC时,我必须根据我放置它的位置相应地编辑代码。

由于我的小“发现”等同于原始代码的最小变化,我将此标记为答案。

感谢所有人花时间回应!