viewDidLoad
的{{1}}是多少?
我有一个带有xib的UIView
。我想在加载时隐藏其中一个子视图。
我试着用这个。
UIView
但子视图- (id)initWithCoder:(NSCoder *)aDecoder{
....
_theView.hidden = YES;
}
此时为零。
This answer没有帮助我,因为在创建_theView
时,UIViewController
尚未创建。它是以编程方式创建的,稍后会创建。
答案 0 :(得分:27)
尝试
-awakeFromNib
方法
或者在xib中为子视图设置隐藏的视图属性
答案 1 :(得分:19)
AwakeFromNib
。
所有视图都会调用layoutSubviews
,您可以在_loaded = yes;
函数中添加bool layoutSubviews
并知道视图是否已加载。
答案 2 :(得分:7)
接受的答案具有误导性。 将始终调用awakeFromNib,而不仅仅是使用nib。 来自apple docs:
<强> awakeFromNib:强>
从接收器加载后准备接收器以进行维修 Interface Builder存档或nib文件。
在下一个例子中,我只使用了一个storyBoard 你可以很容易地测试它。
这是我们的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,创建自己的方法。没有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
答案 3 :(得分:0)
layoutSubviews将调用您可以设置为隐藏的所有视图而不是awakeFromNib。 如果您使用的是xib,则可以设置默认的隐藏属性。
答案 4 :(得分:0)
一般没有这样的方法。问题是,_theView
来自哪里。
如果您的视图(包括其子视图)是从同一个nib / xib / storyboard加载的,那么您可以使用awakeFromNib
,它将在从归档中加载完整对象层次结构后调用,因此您的{{ 1}}也应该设置。
如果您的视图是以编程方式创建的,但未创建_theView
本身的子视图,则表示您的代码中必须有一个位置,您可以在其中添加该子视图。在这种情况下,您有两个选项
_theView
来电。_theView
方法(或类似方法),并在创建视图并分配prepareForDisplay
后调用该方法。在_theView
(或您选择的任何名称)方法中,您可以做任何您喜欢的事情,例如隐藏prepareForDisplay
。我不建议滥用_theView
,因为它用于不同的目的,并且会在视图的生命周期内多次调用,而不是像您希望的那样只调用一次。是的你可以保存它之前是否被调用,但我也认为这也是一个黑客攻击。更好地创建自己的方法,以便在正确设置并调用之后以所需的方式初始化视图。
答案 5 :(得分:0)
private var layoutSubviewsCounter = 0
override func layoutSubviews() {
super.layoutSubviews()
if layoutSubviewsCounter == 0 {
layoutSubviewsCounter += 1
viewDidLoad()
}
}
func viewDidLoad() {
// your code here
}