何かの操作をきっかけに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
}
}