UITableViewを編集モードにして、行を追加するやり方。
UITableViewの基本的な準備や、編集モードへのもっていきかたは、以下記事を参照。
UITableViewの最低限の実装
UITableViewの編集モード
※ViewControllerの全ソースは記事の一番下
- 追加ボタンを用意する。標準で用意されている追加ボタンがあるので、今回はコレを使用。
プロパティとして持たせるのが良いと思うが、1個ぐらいなら都度生成しても良いと思う。
1 2 |
//追加ボタンをプロパティとして持つ self.plusButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(plusButtonTapped(_:))) |
- 編集モードのオン/オフにあわせて、追加ボタンの表示/非表示を行う。
setEditing(_:animated)で実装。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
override func setEditing(_ editing: Bool, animated: Bool) { super.setEditing(editing, animated: true) //テーブルビューを編集モードへ self.tableView.setEditing(editing, animated: animated) //通常 => 編集 if editing { //プラスボタンをナビゲーションバーの左側へ表示させる。 self.navigationItem.setLeftBarButton(self.plusButton, animated: true) } //編集 => 通常 else { self.navigationItem.setLeftBarButton(nil, animated: true) } } |
- 追加ボタンをタップしたときの処理を実装。
beginUpdates()とendUpdates()は、よくわからない場合は、実装しておいた方が無難。
これらのメソッドをつかっておけば、編集中のインデックスのズレを意識しなくていい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//追加ボタンのハンドラ func plusButtonTapped(_ sender: AnyObject) { //あらかじめデータソースを編集しておく。 self.strings.insert("insert1", at: 2) self.strings.insert("insert2", at: 3) //テーブルビュー挿入開始 self.tableView.beginUpdates() //挿入するIndexPath var paths = [IndexPath]() paths.append(IndexPath(row: 2, section: 0)) paths.append(IndexPath(row: 3, section: 0)) //挿入処理 self.tableView.insertRows(at: paths, with: .automatic) //テーブルビュー挿入終了 self.tableView.endUpdates() } |
- 以上で、プロジェクトを実行してみる。
「Edit」ボタンを押すと、編集モードに入り、「+」ボタンが左上に表示される。
「+」をタップすると、今回の場合、2行挿入される。
以下ViewController.swiftの全ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
import UIKit class ViewController: UIViewController { @IBOutlet var tableView: UITableView! var plusButton: UIBarButtonItem? var strings = [String]() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. //データの準備 self.strings.append("aaa") self.strings.append("bbb") self.strings.append("ccc") self.strings.append("ddd") self.strings.append("eee") //テーブルビューのデータソースとしてViewControllerを指定。(storyboardで設定しても良い。) self.tableView.dataSource = self //ナビゲーションバーを表示 self.navigationController?.isNavigationBarHidden = false //ナビゲーションバーの右側に編集ボタンを表示 self.navigationItem.setRightBarButton(self.editButtonItem, animated: true) //追加ボタンをプロパティとして持つ self.plusButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(plusButtonTapped(_:))) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } override func setEditing(_ editing: Bool, animated: Bool) { super.setEditing(editing, animated: true) //テーブルビューを編集モードへ self.tableView.setEditing(editing, animated: animated) //通常 => 編集 if editing { //プラスボタンをナビゲーションバーの左側へ表示させる。 self.navigationItem.setLeftBarButton(self.plusButton, animated: true) } //編集 => 通常 else { self.navigationItem.setLeftBarButton(nil, animated: true) } } func plusButtonTapped(_ sender: AnyObject) { //あらかじめデータソースを編集しておく。 self.strings.insert("insert1", at: 2) self.strings.insert("insert2", at: 3) //テーブルビュー挿入開始 self.tableView.beginUpdates() //挿入するIndexPath var paths = [IndexPath]() paths.append(IndexPath(row: 2, section: 0)) paths.append(IndexPath(row: 3, section: 0)) //挿入処理 self.tableView.insertRows(at: paths, with: .automatic) //テーブルビュー挿入終了 self.tableView.endUpdates() } } //UITableViewDataSource extension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = UITableViewCell() cell.textLabel?.text = self.strings[indexPath.row] return cell } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.strings.count } } |
コメント