25

我试图从 Apple 的粗略文档中找出哪种方法是初始化并将我的 Views 控件添加到控制器视图的最佳位置。

使用 winforms 相当简单,因为它们总是在内部初始化InitializeDesigner,在构造函数中调用。如果可能的话,我正在尝试匹配这种模式的可靠性。

我大部分时间都在和我一起工作——如果这会影响到这一切的话UIViewControllersUITableViewControllersUINavigationController

这是一个例子:

public MyController()
{
    // Here?
    AddViews();
}

public override ViewDidLoad()
{
    base.ViewDidLoad();

    // Or is should it be here?
    AddViews();
}

public override ViewWillAppear(bool )
{
    base.ViewWillAppear(animated);

    // Here?
    AddViews();
}

public override ViewDidAppear(bool animated)
{
    base.ViewDidLoad(animated);

    // Or maybe here?
    AddViews();
}

void AddViews()
{
    UILabel label = new UILabel();
    label.Text = "Test";
    label.Frame = new RectangleF(100,100,100,26);
    View.AddSubView(label);

    UIWebView webview = new UIWebView();
    webview .Frame = new RectangleF(100,100,100,26);
    View.AddSubView(webview);
}

当我将一些 UIControls 添加到不同位置的视图时,我得到了混合结果。有时视觉滞后,有时网络视图隐藏在某个地方。

添加它们是否有一般规则?

4

3 回答 3

73

一般来说,这就是我所做的:

  • ViewDidLoad - 每当我将控件添加到应与视图一起出现的视图时,我立即将其放入 ViewDidLoad 方法中。基本上,只要将视图加载到内存中,就会调用此方法。因此,例如,如果我的视图是具有 3 个标签的表单,我将在此处添加标签;没有这些形式,视图永远不会存在。

  • ViewWillAppear:我通常使用 ViewWillAppear 来更新表单上的数据。因此,对于上面的示例,我将使用它来实际将域中的数据加载到表单中。创建 UIViews 相当昂贵,你应该尽可能避免在 ViewWillAppear 方法上这样做,因为当它被调用时,这意味着 iPhone 已经准备好向用户显示 UIView,你在这里做的任何事情将以非常明显的方式影响性能(例如延迟动画等)。

  • ViewDidAppear:最后,我使用 ViewDidAppear 启动新线程来处理需要很长时间才能执行的事情,例如执行 web 服务调用以获取上面表单的额外数据。好处是因为视图已经存在并且正在向用户显示,您可以在获取数据时向用户显示一个很好的“等待”消息。

不过,您还可以使用其他技巧。假设您希望 UILabel 在表单加载后“飞入”表单。在这种情况下,我会将标签添加到 ViewDidLoad 中的表单,但在视图区域之外有一个 Frame,然后在 ViewDidAppear 中我会制作动画以将其飞回视图中。

希望能帮助到你。

于 2010-02-17T14:46:09.070 回答
9

嗯,苹果的文档似乎很清楚,恕我直言。

如果您以编程方式创建自己的根视图(此特定控制器的视图层次结构的根视图),您应该在-loadView不调用的情况下创建它,super并在完成后设置view属性。如果您的视图是从 nib 加载的,则不应触摸-loadView.

您将自定义子视图添加到视图控制器的视图或以其他方式在-viewDidLoad. 推荐的做法是创建您的 UILabel 和 UIWebView 并在 中-viewDidLoad发布它们-viewDidUnload,设置它们的引用nil是否需要将它们保留在 ivars 中。

注意:-viewDidUnload在 iOS 6 中已弃用并且不再调用,因为UIViewController不再在内存压力下清除其视图。

于 2010-02-17T12:45:19.197 回答
2

viewDidLoad 与“MEMORY”相关,viewWillAppear/viewDidAppear 与“APPEARANCE”相关。视图控制器的视图(它是视图控制器视图的根视图)可以多次出现/消失,即使控制器的视图已经在内存中。

(当提到根视图时,我也指它的子视图,因为根视图引用了它的子视图(子视图),但从视图控制器的角度来看,它通常只知道根视图。对子视图的引用可以正常发生通过视图控制器的出口。)

当出现内存警告时,根视图本身可能会从内存中删除。视图控制器将确定何时是从内存中删除它们的最佳时间。

因此,您通常会在 viewDidLoad 中添加子视图,因为添加子视图意味着将它们添加到内存中。但是,如果您以编程方式创建所有视图(而不是从 nib 文件),则不会。如果是这种情况,那么您应该重写 loadView 方法,并创建一个根视图并在那里添加子视图,因此在这种情况下您可以省略 viewDidLoad 来添加子视图。

于 2012-01-05T12:29:57.437 回答