用于UIView的viewDidLoad?

时间:2013-04-22 11:27:56

标签: ios objective-c uiview uiviewcontroller

viewDidLoad的{​​{1}}是多少?

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

UIView

但子视图- (id)initWithCoder:(NSCoder *)aDecoder{ .... _theView.hidden = YES; } 此时为零。

This answer没有帮助我,因为在创建_theView时,UIViewController尚未创建。它是以编程方式创建的,稍后会创建。

6 个答案:

答案 0 :(得分:27)

尝试

-awakeFromNib方法

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

答案 1 :(得分:19)

仅当从nib文件加载视图时才会调用

AwakeFromNib。 所有视图都会调用layoutSubviews,您可以在_loaded = yes;函数中添加bool layoutSubviews并知道视图是否已加载。

答案 2 :(得分:7)

接受的答案具有误导性。 将始终调用awakeFromNib,而不仅仅是使用nib。 来自apple docs:

<强> awakeFromNib:

  

从接收器加载后准备接收器以进行维修   Interface Builder存档或nib文件。

Link

在下一个例子中,我只使用了一个storyBoard 你可以很容易地测试它。

这是我们的ViewController:

enter image description here

<强> 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

印刷顺序:

  1. 视图控制器中的awakeFromNib
  2. RedView中的awakeFromNib
  3. viewDidLoad中
  4. 当然绿色视图将被隐藏。


    修改

    如果您仅使用代码创建视图,但是您可以自己调用或更好地调用它,那么将不会调用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
}