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 }