代码之家  ›  专栏  ›  技术社区  ›  Chris S

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

  •  24
  • Chris S  · 技术社区  · 16 年前

    我想从苹果的 sketchy

    对于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的混合结果。有时视觉滞后,有时网络视图隐藏在某个地方。

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

    3 回复  |  直到 9 年前
        1
  •  73
  •   Eduardo Scoz    16 年前

    一般来说,我是这样做的:

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

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

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

    希望有帮助。

        2
  •  9
  •   Costique    11 年前

    嗯,苹果的文件看起来很清楚,伊莫。

    如果您以编程方式创建自己的根视图(此特定控制器视图层次结构的根视图),则应该在中创建它 -loadView super 并设置 view -负载视图 .

    可以将自定义子视图添加到视图控制器的视图中,或者在中对其进行修改 -viewDidLoad . 建议的做法是在中创建UILabel和UIWebView 把它们放进去 -viewDidUnload ,将其引用设置为 nil 如果你需要把它们放在ivars里。

    -视图卸载 在iOS 6中已弃用,只是不再调用,因为 UIViewController

        3
  •  2
  •   Coolant    14 年前

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

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

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