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 - 初始化视图控制器。