viewDidLoad为UIView?
什么是UIView
的viewDidLoad
?
我有一个XIB的UIView
。 我想在加载时隐藏它的一个子视图。 我试图用这个。
- (id)initWithCoder:(NSCoder *)aDecoder{ .... _theView.hidden = YES; }
但子视图_theView
视图在这一点上是零。
这个答案没有帮助我,因为在创buildUIViewController
, UIView
还没有创build。 它在后来被编程创build。
仅当从nib文件加载视图时才调用AwakeFromNib
。 layoutSubviews
被调用的所有视图,你可以添加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
打印顺序:
- 在视图控制器awakeFromNib
- 在RedView里面的awakeFromNib
- 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,那么你可以设置默认的隐藏属性。