iOS初始化详细视图控制器

时间:2013-03-07 13:00:25

标签: ios initialization viewcontroller detail

设置“细节”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变量,不会更改标签。

对此有正确的解决方法吗?

2 个答案:

答案 0 :(得分:0)

  1. init UIViewController并传递文字,存储该文字,然后在viewDidLoad更新UILabel
  2. 然后,您可以通过将UILabel公开给其他类(例如属性)来更新{{1}}。

答案 1 :(得分:0)

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

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

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

不知道这是否是最适合你的选择......