何时何地以编程方式初始化/创建视图

时间:2013-08-21 12:13:20

标签: ios objective-c

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

这张幻灯片: enter image description here

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

想象一下我的视图控制器有视图。我想为它添加10个动态UIButtons。 我应该将下面的代码放到 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幻灯片中,建议不要在那里初始化这些视图的几何。

或者我们<{1}}中创建按钮并在viewDidLoad设置其框架?

你通常采取什么方法?

3 个答案:

答案 0 :(得分:0)

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

所以你能做的最好的事情就是添加一个布尔值(让我们命名为isLaunched)。您在方法FALSE

中将其设置为-(void)viewDidLoad

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

你应该有类似的东西:

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

-(void)viewDidAppear:(BOOL)animated
{
    if(!isLaunched)
    {
        //creating and adding buttons
        isLaunched = TRUE;
    }
}

答案 1 :(得分:0)

zbMax(现在是Amar)提供了很好的解决方案来实现viewDidAppear:中的视图创建。我将提供合理的做法(超过viewDidLoad)。

实际上很简单。在viewDidLoad中,实际上还没有设置任何视图,因此任何设置/创建帧或边界的尝试都将非常不一致。 Struts和spring(或autolayout)将在此方法生效后生效,这将对视图进行其他更改。 viewDidAppear:是正确的地方,因为您现在可以依赖现有的视图和设置框架。

答案 2 :(得分:0)

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

根据建议,您应该在viewDidLoad中进行所有初始化,因为这是一次性任务,无需重复。保持对添加的子视图的引用,并在viewDidAppear中为它们提供适当的框架。

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

希望有所帮助!