[英]Cannot update embedded child VC from non-parent VC
最新的Xcode / Swift / iOS。
我有一个主VC(称为StartVC),其中包含子VC(称为TopBarVC),并通过嵌入式segue进行。 子VC包含一个按钮,当按下该按钮时,该按钮会自动切换到第3个VC(称为CategoryPickerOverlayVC)(此VC中的视图用作选择类别的下拉框)。
@IBAction func CategoryFilterButtonPressed(_ sender: Any) {
performSegue(withIdentifier: "toCategoryPickerOverlay", sender: self)
}
从本身由三个按钮组成的下拉框中选择一个选项时,应使用所选按钮的标题替换Child VC中该按钮的标题文本。
在主VC中,当嵌入segue发生时,我使用prepareforsegue将对子VC的引用存储在变量“ topBarReference”中。
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)!
}
然后,第3个VC退回到主VC。 我应该补充一点,当更改子VC中的按钮时,首先在子VC中设置一个带有标题文本的变量(filterButtonText),然后使用该变量通过子VC的viewDidAppear方法设置按钮标题文本。
使用调试器时,我还注意到在展开后似乎无法执行Master VC中的viewDidAppear(我在viewDidAppear中放置了诊断打印到控制台,并且在展开后没有任何打印内容)。 我意识到这可以解释按钮没有更新,但是我不知道为什么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中的第一行工作正常。 如果我从以下方式更改prepareforguegue:
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时,我不得不根据放置位置来相应地编辑代码。
由于我的一点“发现”等同于对原始代码的最小更改,因此我将其标记为答案。
感谢大家抽出宝贵的时间来回应!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.