2

我有这个问题何时/在哪里创建和初始化以编程方式创建的视图,所以我希望这里的一些讨论能为我提供更多关于这个主题的信息。

这张幻灯片: 在此处输入图像描述

说:“不要根据 viewDidLoad 中视图的几何形状来初始化某些东西”并建议viewDidAppear.

想象一下我的视图控制器有视图。我想向它添加 10 个动态 UIButton。我应该把下面的代码放到viewDidAppear中吗?

-(void) viewDidAppear:(BOOL)animated
{
    ...
    UIButton *button1 = [[UIButton alloc] initWithFrame: rect1];
    [self.view addSubview: button1];
    UIButton *button2 = [[UIButton alloc] initWithFrame: rect2];
    [self.view addSubview: button2];
    ...
}

但这会在每次显示视图时创建按钮。是我们想要的吗?另一方面,如果我将代码放在viewDidLoad幻灯片中,建议不要在那里初始化这些视图的几何形状。

或者我们应该在其中创建按钮viewDidLoad并设置它们的框架viewDidAppear

你通常采取什么方法?

4

3 回答 3

0

But this creates the buttons each time the view is shown. 这是真的。

所以你能做的最好的事情就是添加一个布尔值(让我们命名它isLaunched)。您FALSE在方法中将其设置为-(void)viewDidLoad

然后在您执行创建按钮(或其他内容)的位置添加一个if条件,并在最后将布尔值设置为 true。-(void)viewDidAppear

你应该有这样的东西:

-(void)viewDidLoad
{
    //some settings
    isLaunched = FALSE;
}

-(void)viewDidAppear:(BOOL)animated
{
    if(!isLaunched)
    {
        //creating and adding buttons
        isLaunched = TRUE;
    }
}
于 2013-08-21T12:27:51.663 回答
0

zbMax(现在是 Amar)提供了很好的解决方案来实现视图创建,viewDidAppear:我将提供这样做的理由(结束viewDidLoad)。

其实很简单。在viewDidLoad实际上还没有设置任何视图,因此任何设置/创建框架或边界的尝试都将非常不一致。Struts 和 springs(或自动布局)将在此方法之后生效,这将为您的视图创建额外的更改。viewDidAppear:是执行此操作的正确位置,因为您现在可以依赖现有视图和设置框架。

于 2013-08-21T12:35:48.850 回答
0

不使用几何图形的viewDidLoad原因是视图仍在内存中,而不是在窗口中。将视图放在窗口上后,您可以指定几何图形。当viewDidAppear为您的控制器调用时会发生这种情况。

按照建议,您应该进行所有初始化,viewDidLoad因为这是一次性任务,无需重复。保留对添加的子视图的引用,并在viewDidAppear.

当您处理自定义UIView及其子视图时,layoutSubviews您需要在自定义视图中覆盖以重新排列其子视图的几何形状的方法。

希望有帮助!

于 2013-08-21T12:36:34.030 回答