SectionIndexを設定する

UITableViewの右側に出る見出しのことをSectionIndexというのですが、これの出し方です。

SectionIndexを動作させるためには、まずUITableViewをSection区切りに対応させ、その上でSectionIndexの動作を記述するという二段階が必要です。

実装が必要なメソッド

実装が必要なメソッドは以下のものです。

単純なUITableViewと異なる実装が必要なもの

  • numberOfSectionsInTableView
    セクションの数を返す必要がある
  • tableView:numberOfRowsInSection
    セクションごとの要素数を返す必要がある
  • tableview:cellForRowAtIndexPath
    引数として渡されるindexPathのうち、rowの値がsectionごとの相対的な数値になっているので、それに対応する実装が必要

新たに実装が必要になるもの

  • sectionIndexTitlesForTableView
    sectionIndexに表示するsection名の配列(リスト)を取得する
  • tableView:titleForHeaderInSection
    section番号に対応するsectionのタイトルを取得する

具体的な実装方法

セクション番号とセクションごとの相対的なインデックスによってCellを決定する2次元配列と、セクションタイトルを保持する配列の2つを用意します。

var sectionNames:[NSString] = []
var sections:NSMutableArray = []
var dataSource: NSDictionary = NSDictionary()

...(sectionNames, sectionsの値を作成する)...

dataSource = NSDictionary(objects: sections, forKeys: sectionNames)

これらを利用して、以下のように実装します。

func sectionIndexTitlesForTableView(tableView: UITableView) -> [AnyObject]! {
    if(scrolling) {
        return sectionNames
    } else {
        return nil
    }
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return sectionNames.count
}
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return sectionNames[section]
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let cnt = dataSource.objectForKey(sectionNames[section])?.count
    return cnt!
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView
        .dequeueReusableCellWithIdentifier("TableViewCell", forIndexPath: indexPath)
            as TableViewCell
    let sectionName = sectionNames[indexPath.section]
    let items = dataSource.objectForKey(sectionName) as NSArray
    cell.nameLabel.text = items.objectAtIndex(indexPath.row) as NSString
    return cell
}

参考