最終的にこれくらいのパートに分けてプロジェクトを作成しました。
![$テン*シー*シー-1](https://stat.ameba.jp/user_images/20100428/17/xcc/15/78/j/o0367038310515650114.jpg?caw=800)
Main.xcodeprojてのが統合用プロジェクト、これが「ダイスを回せ!」を作り出すわけっす。
でもってCore、GUI、OpenGLフォルダにソース、他のフォルダは各パートごとに開発するためのプロジェクトが入っとります。Testerフォルダにはテスト用のソースね。
![$テン*シー*シー-6](https://stat.ameba.jp/user_images/20100428/22/xcc/30/00/j/o0233042710516088540.jpg?caw=800)
とっかかりはグループのテーブル表示ビューから入りました。SelectGroup/SelectGroup.xcodeprojってやつです。
![$テン*シー*シー-2](https://stat.ameba.jp/user_images/20100428/17/xcc/64/f4/j/o0330036510515657501.jpg?caw=800)
SelectGroupフォルダ内のソース群は、「ダイスを回せ!」本体では使われずグループテーブル表示ビュー単体開発時のみで使用。RootViewControllerってので気づいたと思うけど、XcodeのTable view baseのテンプレートから作られてます。
このRootViewControllerからpresentModalViewControllerを使って、実際のダイスを回せ!で使用してるグループのテーブル表示ビュー コントローラであるGroupTableViewControllerインスタンスを呼び出してます。
当初は、モーダルビューで呼び出そうかな~とか考えていたわけですね。
結局、トップビューになったわけですが。
この段階でCoreクラスとして用意したクラスは
のみ。構造も単純で
というもの。
membersは、この時点ではAppStoreにアップする(1)のクラス図で提示したようなMemberクラスのインスタンスではなくNSStringのインスタンスを入れてます。
ここらへんのダミーデータはRootViewControllerのtestメソッドで設定してます。
こんな感じ。
GroupTableViewController側ではtableView:cellForRowAtIndexPath:メソッドで、このGroupの
メソッドを呼び出して、表示する項目のタイトルに使ってます。
このメソッドは元々NSObjectが持つメソッドで、デバッグ時に以下のように説明を見たいインスタンス変数を選んでおいてコンテキストメニューから「説明をコンソールに出力する」メニューを選んだ時に呼び出されたりするメソッドです。
![テン*シー*シー-4](https://stat.ameba.jp/user_images/20100428/22/xcc/6e/a6/j/o0502074210516078701.jpg?caw=800)
こうすると
![テン*シー*シー-5](https://stat.ameba.jp/user_images/20100428/22/xcc/4d/c9/j/o0502030810516078700.jpg?caw=800)
こうなる。
別にわざわざdescriptionメソッドを置き換える必要はなくて、新規に表示用文字列を返すメソッド定義すればいいんだけど、デバッガで上みたいな事やってみたくて、あえてdescriptionメソッドを置き換えてみますた。
GroupTableViewの項目はGroupCellクラスとして独立して定義。その(199)で紹介した手法を使っとります。
![$テン*シー*シー-3](https://stat.ameba.jp/user_images/20100428/22/xcc/86/95/j/o0500041410516055535.jpg?caw=800)
NSDateFormatterクラスというのはNSDateインスタンスを受け取って、指定した形式の文字列に変換してくれる便利なクラス。ここでは"yyyy.MM.dd"を指定する事で stringFromDateメソッドで2010.4.28 というような文字列を返してもらっとります。
![$テン*シー*シー-7](https://stat.ameba.jp/user_images/20100428/23/xcc/80/00/j/o0328011910516148661.jpg?caw=800)
ここの表示用ね
項目の削除、追加に関してはその(190)、その(191)を読んで下さい。
ちなみにRootViewControllerのinfoViewは、何かの結果表示用にと用意するだけ用意してなにも使わずじまいでした。
ちゃんちゃん。
これが3.16の作業。だいたい3、4時間。
------------
サンプルプロジェクト:Dev20100316.zip
![$テン*シー*シー-1](https://stat.ameba.jp/user_images/20100428/17/xcc/15/78/j/o0367038310515650114.jpg?caw=800)
Main.xcodeprojてのが統合用プロジェクト、これが「ダイスを回せ!」を作り出すわけっす。
でもってCore、GUI、OpenGLフォルダにソース、他のフォルダは各パートごとに開発するためのプロジェクトが入っとります。Testerフォルダにはテスト用のソースね。
SelectGroup/SelectGroup.xcodeproj
![$テン*シー*シー-6](https://stat.ameba.jp/user_images/20100428/22/xcc/30/00/j/o0233042710516088540.jpg?caw=800)
とっかかりはグループのテーブル表示ビューから入りました。SelectGroup/SelectGroup.xcodeprojってやつです。
![$テン*シー*シー-2](https://stat.ameba.jp/user_images/20100428/17/xcc/64/f4/j/o0330036510515657501.jpg?caw=800)
SelectGroupフォルダ内のソース群は、「ダイスを回せ!」本体では使われずグループテーブル表示ビュー単体開発時のみで使用。RootViewControllerってので気づいたと思うけど、XcodeのTable view baseのテンプレートから作られてます。
このRootViewControllerからpresentModalViewControllerを使って、実際のダイスを回せ!で使用してるグループのテーブル表示ビュー コントローラであるGroupTableViewControllerインスタンスを呼び出してます。
当初は、モーダルビューで呼び出そうかな~とか考えていたわけですね。
結局、トップビューになったわけですが。
この段階でCoreクラスとして用意したクラスは
Group
のみ。構造も単純で
@interface Group : NSObject {
NSTimeInterval date; // 日付
NSMutableArray* members; // グループ内のメンバー
}
NSTimeInterval date; // 日付
NSMutableArray* members; // グループ内のメンバー
}
というもの。
membersは、この時点ではAppStoreにアップする(1)のクラス図で提示したようなMemberクラスのインスタンスではなくNSStringのインスタンスを入れてます。
ここらへんのダミーデータはRootViewControllerのtestメソッドで設定してます。
// ダミー設定。
if (dummyGroup == nil) {
dummyGroup = [[NSMutableArray alloc] init];
int group_count = rand() % 5 + 1;
for (int j = 0; j < group_count; j++) {
Group* g = [[Group alloc] init];
int count = rand() % 20;
for (int i = 0; i < count; i++) {
[g.members addObject:
[NSString stringWithFormat:@"Member-%d", i]];
}
[dummyGroup addObject:g];
[g release];
}
}
ctl.groups = dummyGroup;
if (dummyGroup == nil) {
dummyGroup = [[NSMutableArray alloc] init];
int group_count = rand() % 5 + 1;
for (int j = 0; j < group_count; j++) {
Group* g = [[Group alloc] init];
int count = rand() % 20;
for (int i = 0; i < count; i++) {
[g.members addObject:
[NSString stringWithFormat:@"Member-%d", i]];
}
[dummyGroup addObject:g];
[g release];
}
}
ctl.groups = dummyGroup;
こんな感じ。
GroupTableViewController側ではtableView:cellForRowAtIndexPath:メソッドで、このGroupの
- (NSString *)description
メソッドを呼び出して、表示する項目のタイトルに使ってます。
このメソッドは元々NSObjectが持つメソッドで、デバッグ時に以下のように説明を見たいインスタンス変数を選んでおいてコンテキストメニューから「説明をコンソールに出力する」メニューを選んだ時に呼び出されたりするメソッドです。
![テン*シー*シー-4](https://stat.ameba.jp/user_images/20100428/22/xcc/6e/a6/j/o0502074210516078701.jpg?caw=800)
こうすると
![テン*シー*シー-5](https://stat.ameba.jp/user_images/20100428/22/xcc/4d/c9/j/o0502030810516078700.jpg?caw=800)
こうなる。
別にわざわざdescriptionメソッドを置き換える必要はなくて、新規に表示用文字列を返すメソッド定義すればいいんだけど、デバッガで上みたいな事やってみたくて、あえてdescriptionメソッドを置き換えてみますた。
GroupTableViewの項目はGroupCellクラスとして独立して定義。その(199)で紹介した手法を使っとります。
![$テン*シー*シー-3](https://stat.ameba.jp/user_images/20100428/22/xcc/86/95/j/o0500041410516055535.jpg?caw=800)
NSDateFormatterクラスというのはNSDateインスタンスを受け取って、指定した形式の文字列に変換してくれる便利なクラス。ここでは"yyyy.MM.dd"を指定する事で stringFromDateメソッドで2010.4.28 というような文字列を返してもらっとります。
![$テン*シー*シー-7](https://stat.ameba.jp/user_images/20100428/23/xcc/80/00/j/o0328011910516148661.jpg?caw=800)
ここの表示用ね
項目の削除、追加に関してはその(190)、その(191)を読んで下さい。
ちなみにRootViewControllerのinfoViewは、何かの結果表示用にと用意するだけ用意してなにも使わずじまいでした。
ちゃんちゃん。
これが3.16の作業。だいたい3、4時間。
------------
サンプルプロジェクト:Dev20100316.zip