最新的Xcode/Swift/iOS。无法从非父VC更新嵌入式子VC VC
我有一个Master VC(称为StartVC),它包含一个Child VC(称为TopBarVC),通过和嵌入式segue。 Child VC包含一个按钮,当按下按钮时,该按钮将以模态方式延续到第三个VC(称为CategoryPickerOverlayVC)(此VC中的视图用作选取类别的下拉框)。
@IBAction func CategoryFilterButtonPressed(_ sender: Any) {
performSegue(withIdentifier: "toCategoryPickerOverlay", sender: self)
}
当一个选项被从下拉框中,其本身是由三个按钮选择,所选择的按钮的标题应被用来替换在儿童VC按钮的标题文本。
在Master VC中,我使用prepareforsegue在一个变量 - “topBarReference”中存储对Child VC的引用 - 在嵌入Segue发生的时刻。
var topBarReference: TopBarVC?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "TopBarPane"{
topBarReference = segue.destination as? TopBarVC
}
}
然后,在第三VC,当我点击的下拉框中的按钮中选择一个,按钮标题是通过prepareforsegue发送到更新的儿童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中放置了诊断打印到控制台并且在展开后继续打印后没有任何打印)。我意识到这将解释按钮没有得到更新,但我不知道为什么viewDidAppear不运行。
我也试过使用委托协议和instantiateViewController(withString :)无济于事。所有的方法都会产生相同的结果,即Child VC中的按钮不会被更新。没有显示错误。其他一切都按预期发生。
任何想法,我在做什么错?
如果两者都嵌入到StartVC中,即StartVC仍在被看到,那么视图确实会出现不会被调用。 尝试使用通知。 使您的startVC可以侦听特定的通知,并在您从下拉菜单中展开/选择一个选项时将其发送出去。 在您的通知处理程序代码中,更新按钮标题 –
第三个VC是一个独立的VC,未嵌入。 – Rossco
“我不知道为什么viewDidAppear不运行”因为它从未消失。我认为@ShawnFrank也是这么告诉你的。 – matt