ViewController ではViewDidLoad
、VC がいつロードされたかを知る必要があります。
UIView の場合、ビューがロードされたときにどのメソッドを使用する必要がありますか?
このメソッドは init で呼び出されますか?
編集:XIBなし、プログラムのみ。
ViewController ではViewDidLoad
、VC がいつロードされたかを知る必要があります。
UIView の場合、ビューがロードされたときにどのメソッドを使用する必要がありますか?
このメソッドは init で呼び出されますか?
編集:XIBなし、プログラムのみ。
XIB
ファイルからロードすると、awakeFromNib
ロードが完了するとメソッドが呼び出されます。
override public func awakeFromNib() {
super.awakeFromNib();
// ... loading logic here ...
}
アップデート; XIB がない場合は、ドキュメントの「ビュー関連の変更の観察」エリアのいずれかの方法を使用して推測する必要があります(例: )。ただし、可能であれば、View Controller のメソッドからビューにメッセージを送信することをお勧めします。didMoveToSuperview
viewDidLoad
実際には、ビューの初期化のために、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...
}
それがあなたが必要としているものだと思います。
乾杯!
スウィフト 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.
}
}
私は同様の問題を抱えていて、比較的簡単な解決策を見つけました。アイデアは、適切なタイミングですべての子ビューに 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");
}
私の知る限り、init以外にそのような方法はないと思います。通常、init メソッドで準備を行います。独自のviewDidLoad
メソッドを作成して手動で呼び出すことができます。しかし、ほとんどの場合、UIView はそのビュー コントローラーによって管理されるため、ビュー コントローラーはビューが読み込まれるタイミングを認識する必要があります。ビューを構成する場合は、ビュー コントローラーで行うことができます。ちなみに、viewDidLoad
メソッドは常に呼び出されるわけではありません。
このようにうまくいきません。
- (void)viewDidLoad
ビュー コントローラがロードされたときに呼び出されません。ビュー コントローラーのビューが読み込まれるときに呼び出されます。
したがって、UIViewController を作成できます。呼び出される唯一のメソッドは、初期化に使用される init メソッドです。ビューは作成されず、-(void)viewDidLoad メソッドは呼び出されません。
次に、他の何かがView Controllerにそのビューを要求すると、次のようになります。
viewController.view;
次に、View Controller は以下を呼び出します。
- (void)loadView; // This is where you put your own loading view information, and set the viewController's self.view property here.
に続く:
- (void)viewDidLoad;
View Did Load は別のメソッドであるため、実際の loadView メソッドや複雑なビューの読み込みオプションを中断する必要はありません。nibs などを使用するときに loadView メソッドをサブクラス化してオーバーライドすると、開発者が Apple が何をしているのか、ベスト プラクティスが何であるかがわからない場合に問題が発生する可能性があるため、Apple がメソッドを分離するのは賢明でした。
次に、メモリ警告が発生すると、ビューが解放され、nil に設定されます。
- (void)viewWillUnload;
// view unloaded and set to nil.
- (void)viewDidUnload;