UIViewControllerでもeditButtonItemを使いたい！

# はじめに
`UITableViewController` に編集ボタンを置く場合は下記のようにすると編集 -> 完了とかをいい感じに表示してくれます:clap:

```swift
self.navigationItem.rightBarButtonItem = self.editButtonItem
```

しかし、画面上に `TableView` だけでなく固定のフッターとかヘッダーを置きたい場合など `UITableViewController` だと難しい。。。で、いい感じにする方法はないかなと思って思いついたので書いてみます。

# 画面構成
画面構成は下記のように `UIViewController` に `ContainerView` を2つ置いて片方を `UITableviewController` にします。

<img width="500" alt="storyboard" src="https://user-images.githubusercontent.com/34936885/84133614-5498ec80-aa82-11ea-8178-dfc44953add0.png">

# 方法1
`UITableViewController` から `editButtonItem` を取ってきて `UIViewController` に渡す！

実装はこんな感じ

```swift
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)
    }
}
```

結果は下記

| 初期表示 | 編集タップ時 | セルタップ時 |
| --- | --- | --- |
|![initial](https://user-images.githubusercontent.com/34936885/84133200-d76d7780-aa81-11ea-916f-0df8f2394f0b.png)|![tapped_edit](https://user-images.githubusercontent.com/34936885/84133343-04218f00-aa82-11ea-9495-fac4f2dedcf3.png)|![tapped_cell](https://user-images.githubusercontent.com/34936885/84133291-f4a24600-aa81-11ea-8352-5e9cdc256053.png)|

# 方法2
`editButtonItem` は `UITableViewController` にしか無いと思ったけどどうやら `UIViewController` の `extension` らしい。 
なので `UIViewController` に自身の `editButtonItem` を設定して、編集モードの変更時に `UITableViewController` の編集モードも変更してやる。

実装はこんな感じ

```swift
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)` 部分は気持ち悪いけどできた:tada:

![edit](https://user-images.githubusercontent.com/34936885/84133516-3cc16880-aa82-11ea-9944-67ace3fa4c1e.gif)

# さいごに
ただ自分で編集ボタンを置くのが嫌でわるあがきしてみた:grimacing:（できるだけ `UITableViewController` 使いたい！！）