30

viewDidLoadは何UIViewですか?

私はUIViewxibを持っています。ロード時にサブビューの1つを非表示にしたいと思います。これを使ってみました。

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

_theViewしかし、この時点ではサブビューはゼロです。

UIViewControllerを作成した時点でUIViewはまだ作成されていないため、この回答は役に立ちませんでした。後でプログラムによって作成されます。

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

受け入れられた答えは誤解を招くものです。nib が使用されている場合だけでなく、awakeFromNib は常に呼び出されます。アップルのドキュメントから:

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

印刷の順序:

  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

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
于 2015-02-18T19:14:19.870 に答える
2

一般的にはそのような方法はありません。問題は、あなたの_theView出身地はどこかということです。

サブビューを含むビューが同じ nib/xib/storyboardawakeFromNibから読み込まれる場合、アーカイブから完全なオブジェクト階層が読み込まれた後に呼び出される which を使用できるため、_theView同様に設定する必要があります。

ビューがプログラムで作成されているが、それ自体のサブビューを作成していない場合は_theView、そのサブビューを追加するコード内の場所が必要であることを意味します。その場合、2つのオプションがあります

  • _theView追加した後、発信者から非表示にします
  • または、ビュー クラスでメソッド (または同様のもの) を宣言し、prepareForDisplayビューが作成され_theViewて割り当てられた後にそれを呼び出します。そのprepareForDisplay(または選択した名前の)メソッドでは、たとえば hide など、好きなことを行うことができます_theView

これを悪用することはお勧めしませんlayoutSubviews。これは別の目的のためのものであり、ビューの有効期間中に、必要に応じて 1 回だけでなく、数回呼び出されるためです。はい、以前に呼び出されたかどうかを保存できますが、それもハックだと思います。ビューを正しく設定して呼び出した後、独自のメソッドを作成して、必要な方法でビューを初期化することをお勧めします。

于 2015-02-19T12:56:08.890 に答える
0

layoutSubviews は、awakeFromNib ではなく非表示に設定できるすべてのビューに対して呼び出されます。xib を使用している場合は、デフォルトの隠しプロパティを設定できます。

于 2015-02-19T12:16:18.613 に答える