用于UIView的viewDidLoad?

Lud*_*uda 29 objective-c uiviewcontroller uiview ios

有什么viewDidLoadUIView

我有一个UIViewxib.我想在加载时隐藏其中一个子视图.我试着用这个.

- (id)initWithCoder:(NSCoder *)aDecoder{
    ....
    _theView.hidden = YES;
}
Run Code Online (Sandbox Code Playgroud)

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

这个答案没有帮助我,becouse在创建的那一刻UIViewController,在UIView还没有建立.它是以编程方式创建的,稍后会创建.

Lit*_*T.V 27

尝试

-awakeFromNib 方法

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


Reb*_*cca 20

AwakeFromNib仅在从nib文件加载视图时调用. layoutSubviews为所有视图调用,您可以_loaded = yes;layoutSubviews函数中添加bool 并知道视图是否已加载.

  • 记得在所有这些方法上调用super:D (3认同)
  • @Segev,因此,如果在使用笔尖或情节提要时调用awakeFromNib,并且以编程方式创建视图,则不会调用它吗?仅.h和.m或.swift。如果是这样,则您的答案是错误的,并且不会总是调用awakeFromNib。 (2认同)

Seg*_*gev 7

接受的答案是误导性的.将始终调用awakeFromNib,而不仅仅是使用nib.来自苹果文档:

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
Run Code Online (Sandbox Code Playgroud)

RedView.m:

#import "RedView.h"

@implementation RedView

-(void)awakeFromNib
{
        NSLog(@"awakeFromNib inside RedView");
        self.green.hidden = YES;
}

@end
Run Code Online (Sandbox Code Playgroud)

印刷顺序:

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

当然,绿色视图将被隐藏.


编辑:

如果您仅使用代码创建视图但是您可以自己或更好地调用它,则不会调用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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)