viewDidLoad为UIView?

什么是UIViewviewDidLoad

我有一个XIB的UIView 。 我想在加载时隐藏它的一个子视图。 我试图用这个。

 - (id)initWithCoder:(NSCoder *)aDecoder{ .... _theView.hidden = YES; } 

但子视图_theView视图在这一点上是零。

这个答案没有帮助我,因为在创buildUIViewControllerUIView还没有创build。 它在后来被编程创build。

仅当从nib文件加载视图时才调用AwakeFromNiblayoutSubviews被调用的所有视图,你可以添加bool _loaded = yes;layoutSubviews函数中知道是否加载了视图。

尝试

-awakeFromNib方法

或者在xib中为你的子视图设置隐藏的视图属性

接受的答案是误导。 awakeFromNib将始终被调用,而不仅仅是使用笔尖。 从苹果文档:

awakeFromNib:

从接口生成器存档或nib文件加载后,准备接收器以进行服务。

链接

在下一个例子中,我只用了一个storyBoard,你可以很容易地testing它。

这是我们的ViewController:

在这里输入图像说明

ViewController.m:

 #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"viewDidLoad"); } -(void)awakeFromNib { NSLog(@"awakeFromNib in view controller"); } @end 

RedView.m:

 #import "RedView.h" @implementation RedView -(void)awakeFromNib { NSLog(@"awakeFromNib inside RedView"); self.green.hidden = YES; } @end 

打印顺序:

  1. 在视图控制器awakeFromNib
  2. 在RedView里面的awakeFromNib
  3. viewDidLoad中

当然,绿色景观将被隐藏起来。


编辑:

awakeFromNib将不会被调用,如果你只使用代码来创build你的视图,但你可以自己调用它或更好的,创build自己的方法。

没有StoryBoard的示例(仅限代码):

RedView.m:

 #import "RedView.h" @implementation RedView -(void)loadRedView { NSLog(@"loadRedView"); self.green = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; self.green.backgroundColor = [UIColor greenColor]; [self addSubview:self.green]; self.green.hidden = YES; } @end 

ViewController.m:

 #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.red = [[RedView alloc]initWithFrame:CGRectMake(0, 0, 200, 200)]; self.red.backgroundColor = [UIColor redColor]; [self.view addSubview:self.red]; [self.red loadRedView]; } @end 

一般没有这样的方法。 问题是,你的_theView从哪里来。

如果你的视图(包括它的子视图)是从同一个nib / xib / storyboard加载的,那么你可以使用awakeFromNib ,这个对象在从存档中加载完成后会被调用,所以你的_theView应该被设置。

如果您的视图是以编程方式创build的,但不会为_theView本身创build子视图,那意味着在添加该子视图的代码中必须有一个位置。 在这种情况下,你有两个select

  • 添加之后,可以隐藏调用者的_theView
  • 或者在你的视图类中声明一个prepareForDisplay方法(或者类似的方法),并且在你的视图被创build和_theView被赋值之后调用它。 在prepareForDisplay (或任何你select的名字)方法,你可以做任何你喜欢的,例如隐藏_theView

我不build议滥用layoutSubviews ,因为这是为了一个不同的目的,并会在视图的生命周期中多次调用,而不仅仅是一次你想要的。 是的,你可以保存是否之前被叫,但我会认为这是一个黑客。 更好地创build自己的方法,以正确设置并调用该方法之后,以您想要的方式初始化视图。

layoutSubviews将调用所有您可以设置为隐藏的视图,而不是awakeFromNib。 如果你使用xib,那么你可以设置默认的隐藏属性。