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

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

我正在与 UIViewControllersUITableViewControllers 里面一个 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中添加子视图。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top