我是否以编程方式在ViewDidAppear,ViewDidLoad,ViewWillAppear,构造函数中添加子视图?

时间:2010-02-17 12:11:20

标签: iphone xamarin.ios viewdidload viewdidappear viewwillappear

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

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

我大部分时间都在UIViewControllersUITableViewControllers内工作 - 如果这会影响所有这一切。

以下是一个例子:

UINavigationController

当我将它们添加到不同位置的视图时,我得到了一些UIControl的混合结果。有时视觉滞后,其他时候webview被隐藏了。

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

3 个答案:

答案 0 :(得分:73)

一般来说,这就是我的工作:

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

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

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

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

希望它有所帮助。

答案 1 :(得分:9)

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

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

您可以将自定义子视图添加到视图控制器的视图中,或者在-viewDidLoad中对其进行修改。建议的做法是在-viewDidLoad中创建您的UILabel和UIWebView,并在-viewDidUnload中发布它们,如果您需要将它们保存在ivars中,请设置它们对nil的引用。

注意:在iOS 6中不推荐使用-viewDidUnload,因为UIViewController不再在内存压力下清除其视图,因此不再调用它。

答案 2 :(得分:2)

viewDidLoad与'MEMORY'相关,viewWillAppear / viewDidAppear与'外观'相关。即使控制器的视图已经在内存中,视图控制器的视图(视图控制器视图的根视图)也可以多次出现/消失。

(当提到root-view时,我也指它的子视图,因为root-view引用了它的子视图(子视图),但是从视图控制器的角度来看,它通常只知道根视图。通常可以通过视图控制器的插座来实现。)

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

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

相关问题