2017-01-21 31 views
0

最新的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中的按钮不会被更新。没有显示错误。其他一切都按预期发生。

任何想法,我在做什么错?

+0

如果两者都嵌入到StartVC中,即StartVC仍在被看到,那么视图确实会出现不会被调用。 尝试使用通知。 使您的startVC可以侦听特定的通知,并在您从下拉菜单中展开/选择一个选项时将其发送出去。 在您的通知处理程序代码中,更新按钮标题 –

+0

第三个VC是一个独立的VC,未嵌入。 – Rossco

+0

“我不知道为什么viewDidAppear不运行”因为它从未消失。我认为@ShawnFrank也是这么告诉你的。 – matt

回答

0

好了,我发现,我原来的代码工作正常,酒吧一条线在儿童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,所以我必须相应地编辑代码,就我放置的位置而言。

由于我的小“发现”等同于对原始代码的最小更改,因此我将其标记为答案。

感谢大家花时间回复!

0

你的意思是这样的吗?

enter image description here

如果是这样,我使用的解决方案是很简单的:所述第三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 
    } 

}