何かの操作をきっかけにUITableViewにセルを追加したいということがあったのでメモ。
処理の流れとしては以下のような感じ。
- UITableViewCellのオブジェクトを格納した配列を用意する
- 1.で用意した配列に新たにUITableViewCellのオブジェクトを追加する
- 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 } }