30

viewDidLoad为了UIView什么?

我有一个UIView带有xib的。我想在加载时隐藏其中一个子视图。我试着用这个。

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

但此时子视图_theView为零。

这个答案对我没有帮助,因为在创建的那一刻UIViewControllerUIView还没有创建。它是稍后以编程方式创建的。

4

6 回答 6

27

尝试

-awakeFromNib方法

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

于 2013-04-22T11:30:04.877 回答
25

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

于 2015-02-18T08:57:46.983 回答
6

接受的答案具有误导性。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

打印顺序:

  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

视图控制器.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
于 2015-02-18T19:14:19.870 回答
2

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

如果您的视图(包括其子视图)是从同一个 nib/xib/storyboard 加载的,那么您可以使用awakeFromNib它将在从存档加载完整的对象层次结构后调用,因此您_theView也应该设置。

如果您的视图是以编程方式创建的,但没有为_theView自己创建子视图,这意味着您的代码中必须有一个位置可以添加该子视图。在这种情况下,您有两个选择

  • _theView添加后对呼叫者隐藏
  • 或者在您的视图类上声明一个prepareForDisplay方法(或类似方法)并在您的视图创建并_theView分配后调用它。在那种prepareForDisplay(或您选择的任何名称)方法中,您可以做任何您喜欢的事情,例如 hide _theView

我不建议滥用layoutSubviews它,因为它是为了不同的目的,并且会在视图的生命周期内被调用多次,而不仅仅是你想要的一次。是的,您可以保存之前是否调用过它,但我也认为这是一种黑客行为。在正确设置并调用它之后,最好创建自己的方法以您想要的方式初始化视图。

于 2015-02-19T12:56:08.890 回答
0

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

于 2015-02-19T12:16:18.613 回答
0
private var layoutSubviewsCounter = 0
override func layoutSubviews() {
    super.layoutSubviews()
    if layoutSubviewsCounter == 0 {
        layoutSubviewsCounter += 1
        viewDidLoad()
    }
}

func viewDidLoad() {
    // your code here
}
于 2019-03-19T16:09:48.053 回答