次のアプローチを使用して、Swiftに折りたたみリストを実装しました。セクションが折りたたまれている場合でも、単一の行(ヘッダー)が表示されるため、セクションの行数として常に少なくとも1を返します。これは、折りたたんだときにセクションが消えないことを意味します。折りたたまれたステータスが変更されると、tableView.reloadSectionsを使用して、テーブルの関連部分を更新します(アニメーションを使用)
この例では、以下のコードで次の変数を使用します。
sectionHeadings []:セクション見出しの配列
sectionVisible []:そのセクションが折りたたまれているかどうかを示すブールフラグの配列
sectionSubheadings [] []:セクションごとに、セクションが展開されたときに表示される小見出しの配列。
tableViewに関連するメソッドは次のとおりです。
まず、セクション見出し配列に基づいてセクション数を返します。
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// Return the number of sections.
return sectionHeadings.count
}
セクションが折りたたまれているかどうかに応じて、セクションに含まれる行数を決定します。折りたたまれている場合でも、1つのセルが表示されます。これはセクションヘッダーであり、常に表示されます。
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// Return the number of rows in the section.
if sectionVisible[section]{
return sectionSubheadings[section].count + 1
}else{
return 1
}
}
次に、セルを選択すると、現在のステータスを確認し、現在のセクションを開いたり閉じたりします。これと同じ動作をボタンにアタッチすることもできます。
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// if we are selecting a sub heading then this means we want to actually process the click
// if we are selecting a section heading (index 0) then we want to open or close the section
if indexPath.row == 0{
// this is a section heading
// if the section is already open then we don't want to reopen it
let bOpening = !sectionVisible[indexPath.section]
// bunch all our updates together
tableView.beginUpdates()
// need to close any existing open sections
// NB this is optional behaviour and ensures there is only one section open at a time
for (var i:Int = 0;i<sectionVisible.count;i++){
if sectionVisible[i]{
sectionVisible[i] = false
tableView.reloadSections(NSIndexSet(index: i), withRowAnimation: UITableViewRowAnimation.Automatic)
}
}
if bOpening{
// open this chapter
sectionVisible[indexPath.section] = true
tableView.reloadSections(NSIndexSet(index:indexPath.section), withRowAnimation: UITableViewRowAnimation.Automatic)
}
tableView.endUpdates()
}else{
// we have clicked a visible sub heading so process this as required
}
}
tableView:cellForRowAtIndexPathでセルを指定すると、インデックス値に応じてヘッダー行または小見出し行のいずれかを返すことができます。Index = 0はヘッダー、Index = n+1はn番目の小見出しです