前回の続き。今回はセクション分けして行表示する方法の解説です。

サンプルコード: https://github.com/stack3/UITableViewSamples

サンプルコードを起動して、Sectionを選択してください。以下の様な画面が表示されます。

01

スワイプすると削除ボタンが表示されて、それを押すと削除されます。

02

03

STSectionクラス

今回は一次元的な行管理とは違い、セクションごとに行管理しないといけません。1セクションあたりの情報を管理するためにSTSectionクラスを用意しました。

プロパティはこのようになっています。

@interface STSection : NSObject

// セクションのタイトル
@property (strong, nonatomic) NSString *title;
// セクションの行タイトルの配列(NSString配列)
@property (strong, nonatomic) NSMutableArray *rows;

@end

STSectionViewControllerクラス

initメソッドで_sections配列にSTSectionオブジェクトを格納します。

_sections = [NSMutableArray arrayWithCapacity:3];

STSection *section;
section = [[STSection alloc] init];
section.title = @"Section1";
[section.rows addObject:@"Item1"];
[_sections addObject:section];

section = [[STSection alloc] init];
section.title = @"Section2";
[section.rows addObject:@"Item1"];
[section.rows addObject:@"Item2"];
[_sections addObject:section];

section = [[STSection alloc] init];
section.title = @"Section3";
[section.rows addObject:@"Item1"];
[section.rows addObject:@"Item2"];
[section.rows addObject:@"Item3"];
[_sections addObject:section];

行数を返すUITableViewDataSourceメソッドも、今回はセクションを考慮する必要があります。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    STSection *sectionObject = [_sections objectAtIndex:section];
    return sectionObject.rows.count;
}

セクション数を以下のUITableViewDataSourceメソッドで返す必要があります。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return _sections.count;
}

セクションのタイトルを以下のUITableViewDataSourceメソッドで返します。

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    STSection *sectionObject = [_sections objectAtIndex:section];
    return sectionObject.title;
}

おなじみのセルを返すUITableViewDataSourceメソッドもセクションを考慮します。indexPath#sectionで返すべきセルのセクションを得られます。indexPath#rowは、そのセクション内での行インデックスです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = @"cellIdentifier";
    UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }

    STSection *section = [_sections objectAtIndex:indexPath.section];
    NSString *title = [section.rows objectAtIndex:indexPath.row];

    cell.textLabel.text = title;

    return cell;
}

UITableViewDelegateメソッドの行削除処理もセクションを考慮します。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        STSection *section = [_sections objectAtIndex:indexPath.section];
        [section.rows removeObjectAtIndex:indexPath.row];
        [_tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
}

今までのチュートリアルで得た知識の延長でできるので難しくはないはずです。

以上、7回に渡すUITableViewのチュートリアルでした。基本的な使い方はだいたい説明できたかと思います。他にもUITableViewネタで記事を書いています。UITableViewでタグ付けされていますので、参考になるものがあれば幸いです。
UITableViewでタグづけされた記事