忍者ブログ

[PR]

2024年11月21日
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

前回起動時の選択項目にチェックマークを付ける

2009年01月07日
アプリが一回起動した場合、あちらこちらへビューを移動させても、各テーブルの状態は保存されています。タブで他のビューに切り替えた後に元のビューへ戻っても、付けたチェックマークなどはそのまま残っています。ただ、一度アプリを終了し、再度アプリを起動してみるとビューの状態はリセットされています。そのため、もし前回起動した時の状態に戻したい場合には、アプリ終了時点の状態を保存し、ビューを表示する際に保存した状態に復旧する処理を自分で行わなければなりません。今回はその方法のうち、TableCellに関わる部分だけ説明します。まじめに説明するとこれだけでも相当な文量になりますので、他の部分はまた別の機会ということにします。さて、まずは下のコードを見てください。今回も某開発中ソフトのコードをそのまま貼付けています。セクションは1個だけで、3個のセルからなるテーブルで1個を選ぶとその1個だけにチェックマークが付くという処理をさせていた状態で、アプリを終了した場合を想定してみてください。再度立ち上げたので、テーブルを表示する時点では、そのテーブルを扱っているTableViewControllerのviewWillAppearが呼ばれます。ですから、ここで前回の状況へ回復させる処理を行わせるとしましょう。

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

for (int i = 0;i<3;i++) {

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];

UITableViewCell *cell = [myTableView cellForRowAtIndexPath:indexPath];

cell.accessoryType = UITableViewCellAccessoryNone;

}

NSInteger selectedRow = [[myDictionary objectForKey:@"level"]intValue];

NSIndexPath *oldIndexPath = [NSIndexPath indexPathForRow:selectedRow inSection:0];
UITableViewCell *oldCell = [myTableView cellForRowAtIndexPath:oldIndexPath];

oldCell.accessoryType = UITableViewCellAccessoryCheckmark;

}


注目ポイントは4行目の[NSIndexPath indexPathForRow:inSection:]です。これでセクション番号0(つまり一番上のセクション)の行番号i(ここでは一番上の0から三番目の2までが入ります)を示すindexPathが作れます。次の行ではこれを使ってセクション番号0、行番号iのセルへのポインタを獲得しています。そして、そのセルのアクセサリーを「なし(UITableViewCellAccessoryNone)」にしています。この一連の処理で全部のセルからチェックマークを外します(何かの間違いでチェックマークが残らないように、念のために一回全部消してしまっています)。そして今回は詳しく触れませんが、終了時に保存しておいたディクショナリーからどのセルを選択したかの記録を呼び出します。そこから前回選択したセルのポインタを取得、そのアクセサリーを「チェックマークあり(UITableViewCellAccessoryCheckmark)」にしたというわけです。

ちなみに、myTableViewはヘッダーファイル側で

IBOutlet UITableView *myTableView;

と宣言しておき、

@property (nonatomic,retain) UITableView *myTableView;

 
というプロパティにしてあり、さらにメソッドファイルで

@synthesize myTableView;


と@implementation直後に宣言してあり、deallocで


[myTableView release];

と書いてあり、InterfaceBuilder側での俗に言うところの紐付けもしてあるものとします。前提条件もこうして書くと長いものです。

2009.03.04追記
このビューが扱うデータが1つに限定される場合には、ViewWillAppearではなくViewDidLoadに記述しておけば問題ありません。選択させるデータは全く同一でも、複数のビューから呼び出して使い回しをする場合にはViewWillAppearでチェックマークの位置を付け直す必要があります。
PR

セルの高さ

2008年12月09日
テーブルの各セルの高さを変えたい場合はheightForRowAtIndexPathで指定します。これまでと同様にindexPathの値で場合分けをしてゆくと良いでしょう。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == 0) {
if(indexPath.row == 0) {
return 80; // 一番上のセクションの一番上の行の高さは80ピクセルにします。
}
} else if (indexPath.section == 1) {
return 60; // 二番目のセクションの行の高さは全て60ピクセルにします。 
}
return 45; // 上で指定しなかった全てのセクション・行の高さは全て45ピクセルにします。
}

セルの各行に表示するテキスト

2008年11月19日
テーブルの各行に表示するテキストはcellForRowAtIndexPathで知らせます。この命令の引数はindexPathだけですが、indexPathにはindexPath.sectionにセクションのインデックス、indexPath.rowに行のインデックスがそれぞれ格納されています。ですから、indexPath.sectionとindexPath.rowで場合分けをしてあげれば良いのです。デフォルトの設定だと、各セルには1行のテキストが入ります。テキストの中身はcell.textに入れて、最後にcell全体を返します。例は長くなるので途中を省略します。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
switch (indexPath.section) {
case 0: // 一番上のセクションです
switch (indexPath.row) {
case 0: // テーブルの1行目です
cell.text = @"一番上のセクションで一番上の表示項目です";
break;
case 1: // テーブルの2行目です
cell.text = @"一番上のセクションで2番目の表示項目です";
break;
} // 一番上のセクション終了
case 1: // 2番目のセクションです 
(途中略)
} // 4番目のセクション終了 
}
return cell;
}

 

セクションごとの行数

2008年11月19日
セクションごとの行数はnumberOfRowsInSectionで知らせます。どのセクションも同じ行数なら、単純に一行で済みます。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 3; // 各セクションとも3行からなります。
}

ただ、実際にそんなことは滅多にないでしょう。その場合はsectionの値で分岐させて値を返します。この場合も前回と同様セクションが4つある場合です。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch (section) {
case 0:
return 2// 一番上のセクション項目は2行です。
break;
case 1:
return 3; // 上から2番目のセクション項目は3行です。
break;
case 2:
return 1; // 上から3番目のセクション項目は1行です。
break;
case 3:
return 3; // 上から4番目のセクション項目は3行です。
break;
}
}

セクションに表示する文字列

2008年11月19日
セクションに表示する文字列はtitleForHeaderInSectionで知らせます。この命令が呼ばれるときに、sectionにはセクションのインデックスが入っています。一番上のインデックスは0になります。以前の例のようにセクションが4つある場合には、下のような感じにすると良いのではないでしょうか。

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
NSString *str;
switch (section) {
case 0:
str = @"一番上に表示されるセクションタイトル";
break;
case 1:
str = @"上から2個目のセクションタイトル";
break;
case 2:
str = @"上から3個目のセクションタイトル";
break;
case 3:
str = @"上から4個目のセクションタイトル";
break;

return str;
}

テーブルのセクション数

2008年11月19日
テーブルのセクション数はnumberOfSectionsInTableViewで返す値で知らせます。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 4;
}

プログラマ側でいじるのは返す値だけです。上の例では、このテーブルには4つのセクションがありますよと知らせているわけです。

テーブルに文字列を表示する

2008年11月19日
まずはともかくテーブルに文字列を表示してみたい、という場合。

  1. 新規プロジェクトでNavigation-Based Applicationを選び、適当な名前を付けてプロジェクトを作成する。
  2. RootViewController.mからnumberOfRowsInSectionという命令を探し、return 0;をreturn 1;と書き換える。
  3. 同じくRootViewController.mからcellForRowAtIndexPathという命令を探し、最後のreturn cell;の前に cell.text = @"あいうえお"; と書いた行を挿入する。
  4. これをそのままビルドし実行すると、テーブルの一番上の行に「あいうえお」と表示される。
« 前のページ | HOME |