是viewDidLoad
为了UIView
什么?
我有一个UIView
带有xib的。我想在加载时隐藏其中一个子视图。我试着用这个。
- (id)initWithCoder:(NSCoder *)aDecoder{
....
_theView.hidden = YES;
}
但此时子视图_theView
为零。
这个答案对我没有帮助,因为在创建的那一刻UIViewController
,UIView
还没有创建。它是稍后以编程方式创建的。
是viewDidLoad
为了UIView
什么?
我有一个UIView
带有xib的。我想在加载时隐藏其中一个子视图。我试着用这个。
- (id)initWithCoder:(NSCoder *)aDecoder{
....
_theView.hidden = YES;
}
但此时子视图_theView
为零。
这个答案对我没有帮助,因为在创建的那一刻UIViewController
,UIView
还没有创建。它是稍后以编程方式创建的。
尝试
-awakeFromNib
方法
或在 xib 中为您的子视图设置隐藏的视图属性
AwakeFromNib
仅当从 nib 文件加载视图时才调用。
layoutSubviews
为所有视图调用,您可以_loaded = yes;
在layoutSubviews
函数中添加 bool 并知道视图是否加载。
接受的答案具有误导性。awakeFromNib 将始终被调用,而不仅仅是在使用 nib 时。来自苹果文档:
awakeFromNib:
从 Interface Builder 存档或 nib 文件加载接收器后,准备接收器进行服务。
在下一个示例中,我只使用了一个故事板,您可以非常轻松地对其进行测试。
这是我们的视图控制器:
视图控制器.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
视图控制器.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
也应该设置。
如果您的视图是以编程方式创建的,但没有为_theView
自己创建子视图,这意味着您的代码中必须有一个位置可以添加该子视图。在这种情况下,您有两个选择
_theView
添加后对呼叫者隐藏prepareForDisplay
方法(或类似方法)并在您的视图创建并_theView
分配后调用它。在那种prepareForDisplay
(或您选择的任何名称)方法中,您可以做任何您喜欢的事情,例如 hide _theView
。我不建议滥用layoutSubviews
它,因为它是为了不同的目的,并且会在视图的生命周期内被调用多次,而不仅仅是你想要的一次。是的,您可以保存之前是否调用过它,但我也认为这是一种黑客行为。在正确设置并调用它之后,最好创建自己的方法以您想要的方式初始化视图。
layoutSubviews 将调用您可以设置为隐藏的所有视图,而不是 awakeFromNib。如果您使用的是 xib,那么您可以设置默认的隐藏属性。
private var layoutSubviewsCounter = 0
override func layoutSubviews() {
super.layoutSubviews()
if layoutSubviewsCounter == 0 {
layoutSubviewsCounter += 1
viewDidLoad()
}
}
func viewDidLoad() {
// your code here
}