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

Chr*_*s S 25 iphone viewdidload xamarin.ios viewdidappear viewwillappear

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

使用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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Edu*_*coz 73

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

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

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

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

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

希望能帮助到你.

  • 因此,基本上,loadView是UIViewController中的一种方法(尝试将这些内容弄清楚时,请使用rosetta stone-http://tirania.org/tmp/rosetta.html)。框架会在控制器中自动调用此方法以告诉它创建视图,然后UIViewController的默认实现将调用ViewDidLoad。尽管您可以重写此方法(并确保在执行此操作时调用基本方法),但就我个人而言,我更喜欢仅使用viewWillLoad(在loadView之前调用)和viewDidLoad(在之后)调用。 (2认同)

Cos*_*que 9

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

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

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

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