繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM