TableView（xibファイル利用）で簡単なToDoアプリ風を作成

簡単なToDoアプリ風を作成してみた。

xibファイル利用して、Cellの再利用を実装。

完成形はこんな感じ↓

![アラート-2021-06-05-17.23.47.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112697/36aa7b65-b315-541f-1735-fcea0f46e089.gif)


```ruby:FirstViewController
import UIKit

final class FirstViewController: UIViewController {
    
    private let cellClassName = "TableViewCell"
    private let reuseId = "TableViewCell"
    
    private var texts:[Model] = []
    private var heightCache: [CGFloat] = []
    
    
    @IBOutlet weak var tableView: UITableView!{
        didSet{
            let cellNib = UINib(nibName: cellClassName, bundle: nil)
            tableView.register(cellNib, forCellReuseIdentifier: reuseId)
            tableView.delegate = self
            tableView.dataSource = self
        }
    }
    
    @IBAction func addButtun(_ sender: Any) {
        
        var textField = UITextField()

                let alert = UIAlertController(title: "新しいアイテムを追加", message: "", preferredStyle: .alert)

                let action = UIAlertAction(title: "リストに追加", style: .default) { (action) in
                    // 「リストに追加」を押された時に実行される処理

                    let newItem: Model = Model(text: textField.text!)

                    // アイテム追加処理
                    self.texts.append(newItem)
                    self.tableView.reloadData()

                }

                alert.addTextField { (alertTextField) in
                    alertTextField.placeholder = "新しいアイテム"
                    textField = alertTextField
                }

                alert.addAction(action)
                present(alert, animated: true, completion: nil)
        
    }
    
        override func viewDidLoad() {
        super.viewDidLoad()
        
    }


}


extension FirstViewController:UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return texts.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: reuseId, for: indexPath) as? TableViewCell else {
              return UITableViewCell()
            }
        let user = texts[indexPath.row]
        cell.textLabel?.text = user.text
            cell.configure(user: user)
            return cell
    }
    
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        texts.remove(at: indexPath.row)
        let indexPaths = [indexPath]
        tableView.deleteRows(at: indexPaths, with: .automatic)
    }
    
}

extension FirstViewController:UITableViewDelegate {
    
    
}
```

```ruby:TableViewCell

import UIKit

class TableViewCell: UITableViewCell {

    @IBOutlet private weak var Label: UILabel!
    
    override func prepareForReuse() {
        super.prepareForReuse()
        Label?.text = nil
    }
    
    func configure(user: Model) {
        Label?.text = user.text
    }
    
    static func cellHeight(user: Model) -> CGFloat {
        /*読み込むデータに対して高さだけ決める*/
        return 1000
      }
}
```

```ruby:Model

import Foundation

struct Model{
    var text:String = ""
}
```