0

设置“详细”视图控制器的最佳方法是什么?假设我有一个带有 UILabel 的非常简单的 DetailViewController。它有一个 API(这是演示这个概念的伪代码):

UpdateLabel(string text)
{
  this.label.text=text;
}

所以在父 ViewController 中,我有:

PrepareForSegue(UIStoryboardSegue segue, NSObject sender)
{
  base.PrepareForSegue(segue, sender);
  DetaiViewController.UpdateLabel("Hello");
}

但是,由于 ViewDidLoad 尚未被调用,因此在详细视图控制器中“标签”为空,因此崩溃。我知道这可以通过在 UpdateLabel 中添加一些类似的东西来解决

UpdateLabel(string text)
{
  this.View.Hidden=this.View.Hidden; // To force view to load
  this.label.text=text;
}

但这似乎很hacky。

或者,我可以将 UpdateLabel 更改为仅存储字符串:

UpdateLabel(string text)
{
   this.textString.text=text;
}

然后在 ViewDidLoad 中初始化标签:

public override void ViewDidLoad() 
{
   base.ViewDidLoad();
   this.label.text=this.textString;
}

但是如果我希望父控制器稍后修改标签怎么办?调用 UpdateLabel 只会更新 textString 变量并且不会更改标签。

什么是正确的方法?

4

2 回答 2

0
  1. 你传递文本,存储它,init然后更新.UIViewControllerviewDidLoadUILabel
  2. 然后,您可以UILabel通过将其公开给其他类(例如作为属性)来更新 。
于 2013-03-07T13:03:19.200 回答
0

您可以让详细视图控制器在即将显示时更新其视图。

如果详细视图不是由 segue 的结果显示的,例如当您使用选项卡栏时,并且未调用 viewDidLoad,则可以使父控制器成为详细视图控制器的委托,并在 viewWillAppear 上调用更新详细视图控制器的委托方法。之后,详细视图控制器更新其视图/子视图。

这样,您就有机会让父控制器进行更改。

不知道这对你来说是不是最好的选择......

于 2014-01-05T18:30:53.660 回答