はじめに
UITableViewController
に編集ボタンを置く場合は下記のようにすると編集 -> 完了とかをいい感じに表示してくれます
self.navigationItem.rightBarButtonItem = self.editButtonItem
しかし、画面上に TableView
だけでなく固定のフッターとかヘッダーを置きたい場合など UITableViewController
だと難しい。。。で、いい感じにする方法はないかなと思って思いついたので書いてみます。
画面構成
画面構成は下記のように UIViewController
に ContainerView
を2つ置いて片方を UITableviewController
にします。
方法1
UITableViewController
から editButtonItem
を取ってきて UIViewController
に渡す!
実装はこんな感じ
class FirstViewController: UIViewController {
var piyo: PiyoTableViewController? {
return children.first { $0 is PiyoTableViewController} as? PiyoTableViewController
}
override func viewDidLoad() {
super.viewDidLoad()
if let piyo = piyo {
self.navigationItem.rightBarButtonItem = piyo.editButtonItem
}
}
}
class PiyoTableViewController: UITableViewController {
var tableDataList: [Int] = Array(repeating: 0, count: 10)
override func viewDidLoad() {
super.viewDidLoad()
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tableDataList.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = "Row: \(indexPath.row)"
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// 編集モード変更できるのか確認用
setEditing(true, animated: true)
}
}
結果は下記
初期表示 | 編集タップ時 | セルタップ時 |
---|---|---|
方法2
editButtonItem
は UITableViewController
にしか無いと思ったけどどうやら UIViewController
の extension
らしい。
なので UIViewController
に自身の editButtonItem
を設定して、編集モードの変更時に UITableViewController
の編集モードも変更してやる。
実装はこんな感じ
class FirstViewController: UIViewController {
var piyo: PiyoTableViewController? {
return children.first { $0 is PiyoTableViewController} as? PiyoTableViewController
}
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.rightBarButtonItem = editButtonItem
}
override func setEditing(_ editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
piyo?.setEditing(editing, animated: animated)
}
}
class PiyoTableViewController: UITableViewController {
var tableDataList: [Int] = Array(repeating: 0, count: 10)
override func viewDidLoad() {
super.viewDidLoad()
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tableDataList.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = "Row: \(indexPath.row)"
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// 編集モード変更できるのか確認用
parent?.setEditing(true, animated: true)
}
}
parent?.setEditing(true, animated: true)
部分は気持ち悪いけどできた
さいごに
ただ自分で編集ボタンを置くのが嫌でわるあがきしてみた(できるだけ UITableViewController
使いたい!!)