iOS 初始化细节视图控制器

Posted

技术标签:

【中文标题】iOS 初始化细节视图控制器【英文标题】:iOS Initializing a detail View Controller 【发布时间】:2013-03-07 13:00:24 【问题描述】:

设置“详细”视图控制器的最佳方法是什么?假设我有一个带有 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;

但这看起来很老套。

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

UpdateLabel(string text)

   this.textString.text=text;

然后在 ViewDidLoad 中初始化标签:

public override void ViewDidLoad() 

   base.ViewDidLoad();
   this.label.text=this.textString;

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

什么是正确的方法?

【问题讨论】:

【参考方案1】:
    init UIViewController 并传递文本,存储它,然后在 viewDidLoad 上更新 UILabel。 然后您可以通过将UILabel 公开给其他类(例如作为属性)来更新它。

【讨论】:

感谢您的快速回复,但这听起来不是一个很好的 API。实际上,我们有 InitLabel 和 UpdateLabel,但仍不清楚何时可以安全调用 UpdateLabel,例如 InitLabel 紧跟 UpdateLabel 仍然会崩溃。 好吧,使用这种模式已经有一段时间了,我对它没有任何问题。在viewDidLoad你可以调用你用来更新你的UILabel的方法。【参考方案2】:

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

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

这样你就给了父控制器一个改变的机会。

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

【讨论】:

以上是关于iOS 初始化细节视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

在视图初始化之前调用视图控制器中的方法 - iPhone iOS 5 SDK

IOS - 未调用 Facebook SDK fbDidLogin - 初始化视图控制器。

目标 c:iOS 13+ 以编程方式设置初始根视图控制器

使用 UINavigationController iOS 6 弹回初始视图控制器时方向更改

如何添加从启动屏幕到初始视图控制器 ios 的过渡?

如何在 iOS 8/Swift 中构建自定义视图控制器的呈现?变量初始化被证明是困难的