UITableViewのセルを追加する

何かの操作をきっかけにUITableViewにセルを追加したいということがあったのでメモ。

処理の流れとしては以下のような感じ。

  1. UITableViewCellのオブジェクトを格納した配列を用意する
  2. 1.で用意した配列に新たにUITableViewCellのオブジェクトを追加する
  3. UITableViewを更新する

たったこれだけ!
なんということでしょう!
そんなわけで実装してみました。

※IBOutletなどの内容は以下のことをやっておけば問題ありません。
IBOutlet、IBActionについてはこちら

  • FirstViewControllerでUITableViewを紐づける
  • FirstViewControllerで追加ボタンをタップした時の処理を紐づける
  • UITableViewCellクラスを継承し、xibファイルと紐づけたクラスを作る

全体のサンプルコード

FirstViewController.swift

import UIKit

class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet var tableView : UITableView!
    
    // セルのオブジェクトを格納する配列
    var cellArray : NSMutableArray = NSMutableArray.init()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        self.tableView.delegate = self
        self.tableView.dataSource = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // セルの数は配列の数とする
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.cellArray.count
    }
    
    // セルの内容は配列の中身を使う
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return self.cellArray.object(at: indexPath.row) as! TableViewCell
    }
    
    // 配列の高さはxibファイルで設定したのViewの高さとする
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 44.0
    }
    
    // 追加ボタンを押した時の処理
    @IBAction func addTableViewCell() {
        // 新たに追加するセルを配列に格納する
        let cell : TableViewCell = TableViewCell.initFromNib()
        cell.cellTitleLabel?.text = "\(self.cellArray.count + 1).新しい項目"
        self.cellArray.add(cell)
        
        // テーブルビューをリロードする
        self.tableView.reloadData()
    }
}

TableViewCell.swift

import UIKit

class TableViewCell: UITableViewCell {
    @IBOutlet var cellTitleLabel : UILabel!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }
    
    // セルを初期化するメソッド
    class func initFromNib() -> TableViewCell {
        // xibファイルのオブジェクトをインスタンス
        let className : String = String(describing: TableViewCell.self)
        return Bundle.main.loadNibNamed(className, owner: self, options: nil)?.first as! TableViewCell
    }
    
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }
}