我有问题在何时/何地创建和初始化以编程方式创建的视图,所以我希望这里的一些讨论能为我提供更多关于这个主题的信息。
这张幻灯片:
说:“不要根据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
设置其框架?
你通常采取什么方法?
答案 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
是您需要在自定义视图中覆盖的方法,以便重新排列其子视图的几何图形。
希望有所帮助!