脱Auto Layout TabViewController編

## はじめに

最近コードでレイアウトを組んでいるのでその備忘録。ネット上にあまり情報がなかったので残しときます。改善点などがあればコメントして欲しいです。🙇‍♂️なお、外部ライブラリの`SnapKit`を使っています。

完成するアプリの動きとしては

![Simulator Screen Shot - iPod touch (7th generation) - 2020-12-18 at 02.23.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/608eec9f-2332-e504-4c8f-1096c13d4a35.png) ![Simulator Screen Shot - iPod touch (7th generation) - 2020-12-18 at 02.23.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/f17af0be-dcc8-3f3c-e5c4-c90077608963.png)



こんな感じになります。

## 一つ目の画面

つまづいたポイントとしては

- `tableView.register`を忘れていた。
- `dequeueReusableCell`を使っていなかった。

`regesiter`はAutoLayoutだと記述しないので忘れがち。画面遷移しないと思ったらここが原因かも。`dequeueReusableCell`はセルを再利用して処理が重くなるのを防ぎます。カクカクしていたらここを見直すのもありかも。

```swift
import UIKit

final class TableViewController: UITableViewController {
    
    var numbers: [String] = ["リンゴ","ビスケット","砂糖"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .red
        navigationItem.title = "Center"
        tableView.dataSource = self
        tableView.delegate  = self
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return numbers.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        
        cell.textLabel?.text = numbers[indexPath.row]
        return cell
    }
    
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("selected")
        let centerSecondViewController = CenterSecondViewController()
        self.navigationController?.pushViewController(centerSecondViewController, animated: true)
    }
    
}
```



## 二つ目の画面

特に何もしていません。が、`view.backgroundColor = .green`がないと画面がカクカクした画面遷移になってしまいます。

```swift
import UIKit

class CenterSecondViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .green
    }

}
```



## SceneDelegate

これはUINavigationViewCOntroller編のものとほとんど同じです。

cellをタップしても画面遷移しない時などはここでUINavigationViewControllerのrootViewに設定していないことが原因かもしれません。

```swift
import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?
    var navigationVC: UINavigationController!//加えた
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let _ = (scene as? UIWindowScene) else { return }
        guard let _ = (scene as? UIWindowScene) else { return }
        
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            let tableVC = TableViewController()
            navigationVC = UINavigationController(rootViewController: tableVC)
            window.rootViewController = navigationVC
            
            self.window = window
            window.makeKeyAndVisible()
        }
    }
//ここからしたは変えてない
    func sceneDidDisconnect(_ scene: UIScene) {
        // Called as the scene is being released by the system.
        // This occurs shortly after the scene enters the background, or when its session is discarded.
        // Release any resources associated with this scene that can be re-created the next time the scene connects.
        // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
    }

    func sceneDidBecomeActive(_ scene: UIScene) {
        // Called when the scene has moved from an inactive state to an active state.
        // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
    }

    func sceneWillResignActive(_ scene: UIScene) {
        // Called when the scene will move from an active state to an inactive state.
        // This may occur due to temporary interruptions (ex. an incoming phone call).
    }

    func sceneWillEnterForeground(_ scene: UIScene) {
        // Called as the scene transitions from the background to the foreground.
        // Use this method to undo the changes made on entering the background.
    }

    func sceneDidEnterBackground(_ scene: UIScene) {
        // Called as the scene transitions from the foreground to the background.
        // Use this method to save data, release shared resources, and store enough scene-specific state information
        // to restore the scene back to its current state.
    }
}
```

UIViewCOntrollerにtableViewを追加する場合

```swift

import UIKit
import RealmSwift

final class ViewController: UIViewController {
    var numbers: [String] = ["リンゴ","ビスケット","砂糖"]
    fileprivate var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        navigationController?.title = "タスク"
        tableView = UITableView(frame: self.view.bounds, style: .plain)
        tableView.autoresizingMask = [.flexibleWidth,.flexibleHeight]
        tableView.delegate = self
        tableView.dataSource = self
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        view.addSubview(tableView)
    }
}

extension TaskListViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        numbers.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = numbers[indexPath.row]
        return cell
    }
}
```