iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
何事も試してみないと分からない。今回は少しおかしいと思う事もあえてやってみる。
ビューを管理するものといてビューコントローラがあるが、それをInterface Builderを使わないで作成してみよう。
新規ファイルとして、UIViewControllerのサブクラスを作成。ビューコントローラの実装が必要なメソッドにデバッグ出力を埋め込んでみた。
#import <UIKit/UIKit.h>
@interface MyViewController : UIViewController
@end
#import "MyViewController.h"
@interface MyViewController ()
- (void)_init;
@end
@implementation MyViewController
- (id)init
{
DBGMSG(@"%s", __func__);
self = [super init];
if (self) {
[self _init];
}
return self;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
DBGMSG(@"%s", __func__);
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
[self _init];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
DBGMSG(@"%s", __func__);
self = [super initWithCoder:aDecoder];
if (self) {
[self _init];
}
return self;
}
- (void)_init
{
DBGMSG(@"%s", __func__);
}
- (void)dealloc
{
DBGMSG(@"%s", __func__);
}
- (void)loadView
{
DBGMSG(@"%s", __func__);
[super loadView];
}
- (void)viewDidLoad
{
DBGMSG(@"%s", __func__);
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)viewDidUnload
{
DBGMSG(@"%s", __func__);
[super viewDidUnload];
}
- (void)viewWillAppear:(BOOL)animated
{
DBGMSG(@"%s", __func__);
[super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
DBGMSG(@"%s", __func__);
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
DBGMSG(@"%s", __func__);
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
DBGMSG(@"%s", __func__);
[super viewDidDisappear:animated];
}
- (void)didReceiveMemoryWarning
{
DBGMSG(@"%s", __func__);
[super didReceiveMemoryWarning];
}
@end
そして、このビューコントローラのインスタンスを生成して、ビューを取り出してみる。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
....
self.myViewController = [[MyViewController alloc] init];
....
}
当たり前だが、viewDidLoad等は呼ばれない。つまり、ビューコントローラはInterface Builderで生成されるものということか?
メモリ節約のためviewが実際にロードされるのはそれが表示されるときです。だからviewDidLoadもviewController.viewが最初に呼ばれた後になります。 <br> <br>nib内でView Controllerのインスタンスを書いていればnibが読み込まれたときに生成されるし、インスタンスを書いてなければ生成もされません。 <br> <br>iOS6からviewDidUnloadは呼ばれなくなっているなどView Controllerの管理方法には変更があるので確認したほうがいいです。