web-dev-qa-db-ja.com

UIViewのiOS viewDidLoad

ViewControllerには、VCがロードされたときを知るためのViewDidLoadがあります。

UIViewの場合、ビューがロードされたときにどのメソッドを使用する必要がありますか?

このメソッドはinitで呼び出されますか?

編集:XIBなし、プログラムでのみ。

57
manuelBetancurt

XIBファイルからロードする場合、XIBからロードするときにawakeFromNibメソッドが呼び出されます。

editXIBがない場合、おそらくObservingのメソッドのいずれかを使用して推論する必要があります。 ドキュメント のビュー関連の変更エリア(didMoveToSuperviewなど)。ただし、より良い方法は、viewDidLoadメソッドでView Controllerからビューにメッセージを送信することです。

43
borrrden

実際には、ビューの初期化のために、View ControllerのメソッドviewDidLoad()で何もする必要はありません。やりたいことはすべて、ビューのinitメソッドで実行できます。たとえば、View ControllerのviewDidLoad()には、初期化コードがいくつかあります。

- (void)viewDidLoad{
    [super viewDidLoad];

    // init your parameters here
}

同様に、ビューのinitメソッドで:

- (id)initWithDelegate:(id)_delegate
{
    self = [[[[NSBundle mainBundle] loadNibNamed:@"YourView" owner:self options:nil] objectAtIndex:0] retain];
    if (self) {
        [super init];

        self.delegate = _delegate;

        // init your parameters here

        return self;

    }
    return nil;
}

次に、View Controllerから次のようにYourViewを作成します。

YourView view = [[YourView alloc] initWithDelegate:self];
[self.view addSubview:view];
[view release];

さらに、ビューがロードされたときに実行したいことは、次のようにビューのlayoutSubviewsメソッドに配置できます。

-(void)layoutSubviews{
    [super layoutSubviews];

    // init your parameters here, like set up fonts, colors, etc...
}

それがあなたが必要とするものだと思います。

乾杯!

7
akelec

Swift 2:

import UIKit

class myView: UIView {

  override func layoutSubviews() {
    print("run when UIView appears on screen")
    // you can update your label's text or etc.
  }
}
6
fatihyildizhan

WillMove(toSuperview newSuperview:UIView?)を使用できます

import UIKit

final class myView: UIView {

  override func willMove(toSuperview newSuperview: UIView?) {
     super.willMove(toSuperview: newSuperview)
     //Do stuff here
   }

} 

Apple Docs

6
davidrynn

同様の問題があり、比較的簡単な解決策が見つかりました。適切なタイミングでviewDidLoadをすべての子ビューに送信し、目的のクラスでそのメソッドをオーバーロードするというアイデアです。

これを行うには、クラスにコードのこの部分を追加します...

//  UIViewController
- (void)viewDidLoad
{

    [super viewDidLoad];

    [self.view viewDidLoad];
}


//  UIView+Loading.m
#import < UIKit/UIKit.h>

@implementation UIView (Loading)

- (void)viewDidLoad
{

    for (UIView* subview in self.subviews)

        [subview viewDidLoad];
}

@end


//  UIView+Loading.h
#import < UIKit/UIKit.h>

@interface UIView (Loading)

- (void)viewDidLoad;

@end


// UIView_CustomImplementation

- (void)viewDidLoad
{

    NSLog(@"Do whatever you want to do in custom UIView after method viewDidLoad on UIViewController was called");

}
2
vedrano