iPhoneアプリ作成(11) 環境設定テーブル (グループテーブル)
Evernoteなどの環境設定画面は、ボタン、ラベル、テキストフィールド、テーブルなどが混在した画面となっている。
どのようにしたら、このような画面がつくれるのか?
ビューに、ボタンやテキストフィールドを張り付けるのはもちろん問題ないが、「テーブル」が張り付けられない。
テーブルは「ViewController」であり、UIViewではないためViewには追加できないようだ。
解説本を読んでも、このあたりの解説は見当たらない。 困ったーーー。
ふと図書館で立ち読みした解説本に「グループテーブル」「環境設定テーブル」などの言葉が... これか。
で、環境設定用の画面の作り方のポイントを整理してみた。
◆ポイント
・「ボタン」に見えたのでは「ボタン」ではなく、「テーブルのセル」であった ・設定画面は、「UIViewContoroller」 でなく「UITableViewContoroller」 で作成する ・テーブルのスタイルは「UITableViewStyleGrouped」を指定する ・セクションのタイトルとフッターが指定できる タイトルに空白を指定すると、ボタンのように見える タイトル、フッターに各種情報を指定できる ・セルの中に、テキストフィールドなどの編集できる部品を追加できる ・IBでは作成することはできない。
@implementation config01TableViewController
-(id)init{
self = [super initWithStyle:UITableViewStyleGrouped];
if (self) {self.title = @"設定";}
return self;
}
//グループの数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 3;
}
//セクションあたりの行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch (section) {
case 0: return 1;
case 1: return 2;
case 2: return 1;
default: return 0;
}
}
//セクションタイトル
- (NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
switch (section) {
case 0: return @"";
case 1: return @"情報";
case 2: return @"設定";
default: return @"";
}
}
//セクションフッター
- (NSString*)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
switch (section) {
case 0: return @"前回の実行は xx月xx日 hh:mm";
case 1: return @" ";
case 2: return @"";
default: return @"";
}
}
//セクションあたりの行の高さ
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath {
int section = [indexPath section];
switch (section) {
case 0: return 44.0f;
case 1: return 44.0f;
case 2: return 44.0f;
default: return 44.0f;
}
}
//セルを生成する
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
int row = [indexPath row];
int section = [indexPath section];
UITableViewCell *cell;
NSString *CellIdentifier = @"Cell";
switch (section) {
case 0:
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.textLabel.text = @"今すぐ実行";
cell.textLabel.textAlignment = UITextAlignmentCenter;
return cell;
case 1:
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
}
switch (row) {
case 0:
cell.textLabel.text = @"件数";
cell.detailTextLabel.text = @"3";
break;
case 1:
cell.textLabel.text = @"容量";
cell.detailTextLabel.text = @"10MB";
break;
default:
break;
}
return cell;
case 2:
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
UITextField *field = [[[UITextField alloc]init]autorelease];
field.frame = CGRectMake(20,10,300,30);
field.borderStyle = UITextBorderStyleNone;
field.delegate = self;
field.placeholder = @"http://";
[cell addSubview:field];
default:
return cell;
}
}
//キーボードの消去
-(BOOL)textFieldShouldReturn:(UITextField*)textField{
[textField resignFirstResponder];
return YES;
}
//セル選択時の応答処理
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//省略
}
