设置“细节”ViewController的最佳方法是什么?假设我有一个非常简单的带有UILabel的DetailViewController。它有一个API(这是用于演示概念的伪代码):
UpdateLabel(string text)
{
this.label.text=text;
}
所以在父ViewController中,我有:
PrepareForSegue(UIStoryboardSegue segue, NSObject sender)
{
base.PrepareForSegue(segue, sender);
DetaiViewController.UpdateLabel("Hello");
}
但是,由于尚未调用ViewDidLoad,因此“详细信息”控制器中的“label”为空,因此崩溃。我知道这可以通过在UpdateLabel
中添加一些东西来解决UpdateLabel(string text)
{
this.View.Hidden=this.View.Hidden; // To force view to load
this.label.text=text;
}
但这似乎非常讨厌。
或者,我可以将UpdateLabel更改为仅存储字符串:
UpdateLabel(string text)
{
this.textString.text=text;
}
然后在ViewDidLoad中初始化标签:
public override void ViewDidLoad()
{
base.ViewDidLoad();
this.label.text=this.textString;
}
但是,如果我希望父控制器稍后修改标签怎么办?调用UpdateLabel只会更新textString变量,不会更改标签。
对此有正确的解决方法吗?
答案 0 :(得分:0)
init
UIViewController
并传递文字,存储该文字,然后在viewDidLoad
更新UILabel
。UILabel
公开给其他类(例如属性)来更新{{1}}。 答案 1 :(得分:0)
您可以使详细视图控制器在其即将显示时更新其视图。
如果细节视图不是由segue的结果显示,例如,当您使用标签栏,并且未调用viewDidLoad时,您可以使父控制器成为详细视图控制器的委托,并且viewWillAppear您调用委托方法来更新详细视图控制器。之后,详细视图控制器会更新其视图/子视图。
这样您就有机会让父控制器进行更改。
不知道这是否是最适合你的选择......