Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法从非父VC更新嵌入的子VC_Ios_Swift_Xcode_Uicontainerview_Viewdidappear - Fatal编程技术网

Ios 无法从非父VC更新嵌入的子VC

Ios 无法从非父VC更新嵌入的子VC,ios,swift,xcode,uicontainerview,viewdidappear,Ios,Swift,Xcode,Uicontainerview,Viewdidappear,最新Xcode/Swift/iOS 我有一个主VC(称为StartVC),其中包含一个子VC(称为TopBarVC)via和嵌入式segue。子VC包含一个按钮,当按下该按钮时,该按钮会与第三个VC(称为CategoryPickerRoverLayVC)进行模式切换(此VC中的视图用作选择类别的下拉框) 当从下拉框中选择一个选项(下拉框本身由三个按钮组成)时,应使用所选按钮的标题替换子VC中按钮的标题文本 在主VC中,我使用prepareforsegue在嵌入序列发生时将对子VC的引用存储在变量

最新Xcode/Swift/iOS

我有一个主VC(称为StartVC),其中包含一个子VC(称为TopBarVC)via和嵌入式segue。子VC包含一个按钮,当按下该按钮时,该按钮会与第三个VC(称为CategoryPickerRoverLayVC)进行模式切换(此VC中的视图用作选择类别的下拉框)

当从下拉框中选择一个选项(下拉框本身由三个按钮组成)时,应使用所选按钮的标题替换子VC中按钮的标题文本

在主VC中,我使用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”)

然后,第三个VC将分段放回主VC。我应该补充一点,当子VC中的按钮被更改时,子VC中的一个变量(filterButtonText)首先被设置为标题文本,然后这个变量通过子VC的ViewDidDisplay方法被用来设置按钮标题文本


在使用调试器时,我还注意到主VC中的ViewDidDisplay在展开后似乎不会执行(我在ViewDidDisplay中向控制台放置了一个诊断打印,在展开序列后不会打印任何内容)。我意识到这可以解释为什么按钮没有得到更新,但我不知道为什么viewDidAppear没有运行

我还尝试过使用委托协议和实例化eViewController(带字符串:)但没有效果。所有方法都会产生相同的结果,即子VC中的按钮不会得到更新。没有显示任何错误。其他一切都如期发生


你知道我做错了什么吗?

你的意思是这样的吗

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

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


好的,我发现我的原始代码在子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方法似乎会有所不同,尽管我不知道为什么

谢谢马特给了我改变现状的想法。马特的方法在我尝试它时确实奏效,不过,由于我正在向主VC而不是子VC退绕,我不得不根据我放置代码的位置相应地编辑代码

因为我的小小的“发现”等同于对原始代码的最小更改,所以我将把它标记为答案


感谢大家花时间回复

如果它们都“嵌入”到StartVC中,即StartVC仍在显示中,则不会调用view did exeed。尝试使用通知。让您的startVC监听特定的通知,并在您从下拉列表中展开/选择某个选项时发送该通知。在您的通知处理程序代码中,更新按钮标题第三个VC是一个独立的VC,不是嵌入的。“我不知道为什么ViewDidAspect不运行”,因为它从未消失。我想这也是@ShawnFrank告诉你的。@Rossco,要尝试Shawn Frank的评论,你可以在
Master VC
的ViewDidDemouse方法中进行测试,如果在执行segue时执行。@Shawn Frank:谢谢你的回复-我还没有使用通知(尽管我知道它们),所以以后会查看它。我相信我的原始代码应该可以工作,所以我希望有人指出为什么不能,而不是直接改变更新按钮文本的机制。
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
    }

}
        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)

    }