目的
カスタムUIViewControllerインスタンスをXIBファイルを使わずにプログラム上で作る方法を理解する。
![テン・シー・シー-3](https://stat.ameba.jp/user_images/20091229/14/xcc/64/95/j/o0207038010357216838.jpg?caw=800)
主要クラス
UIViewController
XIBファイルを利用しなくとも、viewDidLoadメソッドをオーバライドすることで、任意のビューやコントロールを配置することが可能であることを学習する。
このドリルでは既存のファイル(UIApplicationDelegateを継承したクラスのソースファイル)に追加する形でカスタムUIViewControllerクラス定義、実装をおこなっている。実際のプロジェクトではカスタムUIViewControllerクラス用の別ファイルを用意するのが妥当。ただしそれはソース管理の問題であり、実装上の制限ではないという事を理解するためにあえてこの形を取る。
使用テンプレートプロジェクト
Window-based Application
プロジェクトの名称
CustomViewController
サンプル実装説明
UIViewControllerのinitメソッドはXIBファイルが見つからない場合、UViewを一つ作成した後自身のviewとして設定し、viewDidLoadメッセージを自らに送る。このため、viewDidLoadメソッドをカスタムUIViewController側で実装して、できあがったviewにサブビューを配置する事が可能。
サンプルではviewの背景を青色に設定し、UIButtonを一つ作成しviewに貼付けている。
まず、CustomViewControllerAppDelegate.mに以下のようにCustomViewControllerクラスを定義し実装する。
@interface CustomViewController : UIViewController {
}
@end
}
@end
これでCustomViewControllerインスタンスが作成可能になった。
同時に、CustomViewControllerAppDelegate.hで以下のように定義し上記インスタンスを保持できるようにする。
@class CustomViewController;
@interface CustomViewControllerAppDelegate : NSObject {
UIWindow *window;
CustomViewController* controller;
}
@interface CustomViewControllerAppDelegate : NSObject
UIWindow *window;
CustomViewController* controller;
}
@class CustomViewControllerとする事で、CustomViewControllerクラスの詳細を明示せずにcontroller変数の型として利用できるようにしている。外から操作させないのでwindowのような@property宣言は不要。@property宣言については別ドリルで。
CustomViewControllerインスタンスはCustomViewControllerAppDelegateクラスのapplicationDidFinishLaunchingメソッドで作成し、アプリケーションのwindowにaddSubviewでCustomViewControllerインスタンスのviewを追加する。CustomViewControllerAppDelegateが解放されるdeallocメソッドで、このインスタンスも解放する。
- (void)applicationDidFinishLaunching:(UIApplication *)application {
controller = [[CustomViewController alloc]init];
[window addSubview:controller.view];
[window makeKeyAndVisible];
}
- (void)dealloc {
[window release];
[controller release];
[super dealloc];
}
controller = [[CustomViewController alloc]init];
[window addSubview:controller.view];
[window makeKeyAndVisible];
}
- (void)dealloc {
[window release];
[controller release];
[super dealloc];
}
window addSubviewとすることで、初めて表示される
ただし、この状態でビルドしてもリンクで失敗する。@interface CustomViewController~@end宣言の後に@implementation CustomViewController~@endが必要。
@interface CustomViewController : UIViewController {
}
@end
@implementation CustomViewController
@end
}
@end
@implementation CustomViewController
@end
これで実行までできる。
![テン・シー・シー-1](https://stat.ameba.jp/user_images/20091229/14/xcc/ef/ad/j/o0207037310357216833.jpg?caw=800)
このままだと特に変化がわからないのでCustomViewControllerのviewDidLoadメソッドを実装、背景色に青色を指定する。
@implementation CustomViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blueColor];
}
@end
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blueColor];
}
@end
ビルドして実行。
![テン・シー・シー-2](https://stat.ameba.jp/user_images/20091229/14/xcc/40/67/j/o0207037210357216836.jpg?caw=800)
CustomViewControllerが扱うviewの背景色が変更できたのを確認したら、次はUIButtonの追加をおこなう。
今回は、UIButtonTypeInfoLight型のUIButtonを作成し、frameプロパティを設定しviewにaddSubviewする。
@implementation CustomViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blueColor];
UIButton* button = [UIButton buttonWithType:UIButtonTypeInfoLight];
button.frame = CGRectMake(100,100,100,100);
[self.view addSubview:button];
}
@end
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blueColor];
UIButton* button = [UIButton buttonWithType:UIButtonTypeInfoLight];
button.frame = CGRectMake(100,100,100,100);
[self.view addSubview:button];
}
@end
CGRectMakeで指定している矩形座標自体は適当
ビルドして実行。
![テン・シー・シー-3](https://stat.ameba.jp/user_images/20091229/14/xcc/64/95/j/o0207038010357216838.jpg?caw=800)
ボタンを押すとハイライトされるはず。
ただしボタンクリックアクションへの対応を実装していないので、何もおこりはしない。
プロジェクト
検討
viewに割り付けられるUIViewインスタンス自体を自前で作成したものにしたい場合、loadViewメソッドを実装することになる。この場合、通常のメソッドオーバーライドとは違い[super loadView]はおこなわない。
次のドリルではUIImageViewをviewに割り付けてみる。