我是否以编程方式在 ViewDidAppear、ViewDidLoad、ViewWillAppear、构造函数中添加子视图?
-
21-09-2019 - |
题
我正在尝试从 Apple 中找出答案 粗略的 文档 哪种方法是初始化视图控件并将其添加到控制器视图的最佳位置。
对于 winforms 来说这是相当简单的,因为它们总是在内部初始化 InitializeDesigner
, ,在构造函数中调用。如果可能的话,我正在尝试匹配这种模式的可靠性。
我正在与 UIViewControllers
和 UITableViewControllers
里面一个 UINavigationController
大多数时候——如果这影响了一切的话。
这是一个例子:
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);
}
当我将一些 UIControl 添加到不同位置的视图时,我得到了混合结果。有时视觉滞后,有时网络视图隐藏在某处。
添加它们是否有需要遵守的一般规则?
解决方案
一般来说,这就是我所做的:
查看是否加载 - 每当我向视图添加应与视图一起出现的控件时,我都会立即将其放入 ViewDidLoad 方法中。基本上,只要视图加载到内存中,就会调用此方法。例如,如果我的视图是一个带有 3 个标签的表单,我会在此处添加标签;如果没有这些形式,视图将永远不会存在。
查看将出现:我通常使用 ViewWillAppear 只是为了更新表单上的数据。因此,对于上面的示例,我将使用它来将数据从我的域实际加载到表单中。创建 UIView 的成本相当高,您应该尽可能避免在 ViewWillAppear 方法上执行此操作,因为当调用该方法时,这意味着 iPhone 已经准备好向用户显示 UIView,并且您在此处执行的任何繁重操作将以非常明显的方式影响性能(例如动画延迟等)。
查看已出现:最后,我使用 ViewDidAppear 启动新线程来处理需要很长时间才能执行的事情,例如执行 Web 服务调用来获取上面表单的额外数据。好处是,因为视图已经存在并且是显示给用户时,您可以在获取数据时向用户显示一条漂亮的“等待”消息。
不过,您还可以使用其他技巧。假设您希望 UILabel 在加载表单后“飞”到表单中。在这种情况下,我会将标签添加到 ViewDidLoad 中的表单中,但框架位于视图区域之外,然后在 ViewDidAppear 中我将执行动画以将其飞回视图中。
希望能帮助到你。
其他提示
嗯,苹果的文档似乎是很清楚的,恕我直言。
如果你创建自己的根视图(这个特殊的控制器的视图层次的根视图)编程,你应该-loadView
创建时不调用super
并在完成后设置view
属性。如果您的视图是从笔尖加载,你不应该接触-loadView
。
您添加自定义子视图的视图控制器的视图或以其他方式修改它-viewDidLoad
。建议的做法是在-viewDidLoad
创建您的UILabel和一个UIWebView并-viewDidUnload
释放出来,设置其引用如果你需要保持他们的ivars到nil
。
注意:-viewDidUnload
已被弃用在IOS 6中,并只是不叫任何更多,因为UIViewController
不再清除内存压力下其视图
viewDidLoad中涉及 '记忆',和viewWillAppear中/ viewDidAppear涉及 '外观'。视图控制器的观点(这是您的视图控制器的视图的根视图)可出现/消失了无数次,即使控制器的观点已在内存中。
(当指根视图,我也意味着它的子视图,这是因为根视图具有参考其子女(子视图),但是从一个视图控制器的角度来看,通常知道只是根视图。参照子视图可以通过视图控制器的出口通常发生。)
在根视图本身可从存储器时,有一个存储器警告被移除。视图控制器将确定何时是从存储器中移除他们的最佳时间。
所以,你通常会添加在viewDidLoad中的子视图,因为添加子视图是指将其添加到内存中。但如果你(从笔尖文件不)创建你的视图编程。如果是这样的话,那么你应该重写的loadView方法,并创建一个根视图,并添加子视图存在,所以在这种情况下,你可以省略viewDidLoad中添加子视图。