開発段階で便利に使えるViewControllerの管理クラスを実装する

| コメント(0) | トラックバック(0)
アプリを開発するにあたり、いきなり各機能が複雑に干渉しあう本番機能を実装する事は非常にリスキーです。
まずは各機能が仕様を満たせるか、技術的に問題は無いかを確認する目的で単機能のViewControllerを実装する方も多いのではないでしょうか。
例えば録音機能と取得した音量に合わせてマスコットがアニメーションする機能を実装したい場合、録音機能用のViewControllerとアニメーション用のViewControllerを実装するといった具合になります。

確認用のViewControllerが少ないうちはAppDelegateのviewControllerプロパティに見たい画面を毎度設定し直せば済みますが、画面が多くなってくるとそれも煩雑になってきます。
また確認したい画面が変わるだけで毎回ビルドし直すというのも面倒です。できれば各画面に遷移する事ができる初期画面が欲しい所です。

今回は簡単に実装でき、且つ新しいViewControllerも簡単に追加できる初期画面の実装を紹介します。

各ViewControllerはplistで管理します。
SampleViewControllers.plistを追加し、次のようにデータを入力します。
SampleViewControllers.plist
Rootの属性をArrayに変更します。
Rootの下にDictionary型のアイテムを追加し、Dictionary型アイテムの下に「title」と「class」というキーを持つString型のアイテムを追加します。
titleアイテムの値にはViewControllerのタイトルとなる文字列を設定します。
classアイテムの値には表示したいViewControllerのクラス名を設定します。
上図では6つのViewControllerを追加しています。

UITableViewControllerを継承したクラス「SampleManagerViewController」を追加します。

@interface SampleManagerViewController : UITableViewController


@end


上で作成したplistから読み込んだデータソースを管理するプロパティを追加します。

@interface SampleManagerViewController ()


@property (nonatomic, retain) NSArray* dataSource;


@end


viewDidLoadでSampleViewControllers.plistから情報を読み込みます。

- (void)viewDidLoad {

    [super viewDidLoad];

    

NSString* path = [[NSBundle mainBundle] pathForResource:@"SampleViewControllers" ofType:@"plist"];

self.dataSource = [NSArray arrayWithContentsOfFile:path];

}


tableViewのセクション数は1を返します。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 1;

}


行数はSampleViewControllers.plistから読み込んだViewControllerの数を返します。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return self.dataSource.count;

}


各Cellにはtitleを表示します。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

}

NSDictionary* dic = [self.dataSource objectAtIndex:indexPath.row];

cell.textLabel.text = [dic objectForKey:@"title"];

return cell;

}


Cellタップ時の動作として、NSClassFromString()を用いclassに設定された文字列からClass型オブジェクトを求め、そのViewControllerへ遷移させます。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

NSDictionary* dic = [self.dataSource objectAtIndex:indexPath.row];

NSString* className = [dic objectForKey:@"class"];

Class sampleClass = NSClassFromString(className);

UIViewController* sampleView = [[[sampleClass alloc] init] autorelease];

[self.navigationController pushViewController:sampleView animated:YES];

}


これで初期画面の実装は終了です。
後は初期画面をAppDelegateのviewControllerに設定すれば完了です。
画面遷移はpushViewControllerで行っているため、UINavigationControllerのrootViewControllerに初期画面を追加します。

#import "SampleManagerViewController.h"

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

UIViewController* rootView = [[[SampleManagerViewController alloc] init] autorelease];

self.viewController = [[[UINavigationController alloc] initWithRootViewController:rootView] autorelease];

    self.window.rootViewController = self.viewController;

    [self.window makeKeyAndVisible];

    return YES;

}


@end


新しく画面を追加したい場合は、SampleViewControllers.plistに項目を追加してください。

トラックバック(0)

トラックバックURL: http://www.ict-fractal.com/MovableType/mt/mt-tb.cgi/76

コメントする

Twitterボタン
Twitterブログパーツ