【UITableViewController】超かんたん実装!ソースコード解説
こんにちは!
「UITableViewController」と「UITableView」が別物だとさっきはじめて知りました僕です!
今回は「UITableViewController」と「Coredata」を使ってフォルダで分別できるメモ帳を作ってみました。
「UITableViewController」の超簡単な使い方メモ
(1)「UITableViewController」をストーリーボードに設置
ストーリーボードにて、部品の中から「UITableViewControlle」を選んでボード内にドラッグ&ドロップします。
(2)「UITableViewController」の中にある「Table View Cell」の中に「UIlabel」を設置
「UITableViewController」の中にある「Table View Cell」の中に「UIlabel」をドラッグ&ドロップで設置します。別に設置しなくても動くには動くんですけど、labelすらないテーブルに何の意味があるのかという話になりますので、最低限labelだけは設置しておきます。
(3)「UITableViewController」の中にある「Table View Cell」の「identifier」に好きな名前をつける
「UITableViewController」の中にある「Table View Cell」の「identifier」に好きな名前をつけます。tableCellでもTestCellでもお好みに。ちなみに「identifier」って、「アイデンティファイア」って読むんですよ。知っていましたか?僕は知りませんでした。必殺技みたいでかっこいい名前ですね。
(4)「UITableViewController」とSwiftファイルを紐づける
Swiftファイルを新規作成します。ファイル名はお好みで。ファイルが作成できたら、ストーリーボードのIdentity inspectorタブの「Custom Class」という部分から「UITableViewController」とswiftファイルの紐付けを行います。
(5)2つの必須メソッドを追加
テーブルビューには2つの必須メソッドが存在します。それが下記です。
override func tableView(_ table : UITableView, cellForRowAt: IndexPath) -> UITableViewCell{
let cell = table.dequeueReusableCell(withIdentifier: "さっきidentifierにつけた名前", for: cellForRowAt)
cell.textLabel?.text = "test"
return cell
}
override func tableView(_ table : UITableView, numberOfRowsInSection: Int) -> Int {
return 3
}
1つ目のメソッドが、セルの中身を定義するメソッド。
2つ目のメソッドが、セルの個数を定義するメソッド。
とりあえず上記をそのままコピペして、実行してみてください。「test」と3つ並んだテーブルが作成されるはずです。
「UITableViewController」を使う場合は「UITableViewDataSource」と「UITableViewDelegate」を継承する必要はありません。
すでに「UITableViewController」の中に含まれているからです。やったね楽チンだ。
(6)2つのメソッドの中身をいい感じに整える
2つのメソッドの中身をいい感じに整えてください。以上おわり。
※ 右上のフォルダ追加ボタンは気にしないでください。
セルがタップされた際の動作を追加
セルがタップされた際の動作を追加しましょう。
セルがタップされた時に呼び出されるメソッドについては、公式リファレンスでは「UITableViewのページ」ではなく「UITableView Delegateのページ」に書かれています。
参考:https://developer.apple.com/documentation/uikit/uitableviewdelegate
「func tableView(UITableView, didSelectRowAt: IndexPath)」というメソッドが、セルタップ時に呼び出されるメソッドです。
「タップした」だの「スクロールした」だの「スワイプした」だの、そういう画面触った系の処理はすべてデリゲートのページに書かれています。ややこしいなぁ〜全部UITableViewのページに書いておいてくれよと感じるのは僕だけかい?
override func tableView(_ table: UITableView, didSelectRowAt indexPath: IndexPath){
}
↑この中にセルがタップされた際の処理を書いていきます。
今回は「セルがタップされたら画面遷移をする」という処理にしたかったので、下記のように書きました。あくまで一例です。segueを使用して画面遷移をした場合の例です。
override func tableView(_ table: UITableView, didSelectRowAt indexPath: IndexPath){
self.performSegue(withIdentifier: "あらかじめ指定しておいたsegueの名前", sender: nil)
}
セルを増やす
「ボタンを押したらセルを増やす」という動作を追加します。といっても別に追加用のメソッドがあるわけではないんですよ。
(1)セル追加ボタンを設置
ストーリーボードにて、セル追加ボタンを設置しswiftファイルとactionで繋いでおきます。
(2)セル情報の保存元となる場所にデータを追加
セル情報の保存元となる場所(Core Dataだったり、配列だったり、とにかくセル情報を保存しているところ)にデータを追加します。
(3)UITableViewを更新
データの追加が終わったタイミングで、「reloadDataメソッド」でUITableViewを更新します。すると新しく追加したセルが表示されます。
スワイプでボタンを表示
override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let editAction = UIContextualAction(style: .normal, title: "Edit", handler: {(action: UIContextualAction, view: UIView, completion: (Bool) -> Void) in
//Editを選んだときの動作
completion(true)
})
editAction.backgroundColor = UIColor.green
let deleteAction = UIContextualAction(style: .destructive, title: "Delete", handler: { (action: UIContextualAction, view: UIView, completion: (Bool) -> Void) in
//Deleteを選んだときの動作
completion(true)
})
deleteAction.backgroundColor = UIColor.red
return UISwipeActionsConfiguration(actions: [editAction, deleteAction])
}