サトリク
今回は、カスタムセルを使ったテーブルビューの使い方について解説していきたいと思います。
ネットで調べてもなかなか良い記事がなかったので、ここでは初心者に向けてしっかりと解説していきたいと思います。
カスタムセルとは?
簡単に言うとセルだけのファイルを作って、それをテーブルに載せる。というのがカスタムセルです。
少し複雑なセルを作るときは、このカスタムセルを使いましょう。
例えば、このように画像とかあるセルはカスタムセルで作った方がいいと思います。
サトリク
そもそも、テーブルビューの使い方がわからないよと言う方はまずこちらの記事を見てください。
動作環境
Item | Version |
---|---|
Swift | 5.3.1 |
Xcode | 12.2 |
Interface | Storyboard |
実装の仕方を簡単に解説
作ったことあるけど、やり方忘れちゃったという方のために簡単に解説します。
①TableView
を配置して紐付ける
②「subclass」をUITableViewCell
にして、「Also create XIB file」にチェック入れてセルだけのクラスとボードを作成
③ViewDidLoad
に以下のコードを記述
tableView.register(UINib(nibName: "MainTableViewCell", bundle: nil), forCellReuseIdentifier: "customCell")
※MainTableView
はTableCellクラスの名前
④func tableViewのUITableViewCell
に以下のコードを記述
let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! MainTableViewCell
※MainTableViewはTableCellクラスの名前
ざっと簡単に説明するとこんな感じです。これだけでカスタムセルが作れます。
では、初心者でもわかるように細かく解説していきたいと思います。
実際に作ってみる
まずはプロジェクトを新しく作ってカスタムセルを実装してみましょう。
「Create a new Xcode Project」>「App」>InterfaceはStorybaordを選んで「Create」
①TableViewを配置
②TableViewを広げる
delegate
とdataSource
を紐付けます。
①TableViewで右クリック
②dataSource
のまるぽちをView Contoller
にドラッグ&ドロップ
同じようにdelegagte
もドラッグ&ドロップしてください。
TableViewをtableView
という名前で紐づけます。
メニューバーのFile > New > File…をクリックしてください。
「Cocoa Touch Class」を選択して、「Next」をクリックしてください。
①「Subclass of:」を「UITableViewCell」に変更
②「Class」にMainTableViewCell
と入力
③「Also create XIB file」にチェックを入れる←重要!
でNextをクリック
そのまま何もせずにCreateをクリック
そうすると、このようにMainTableViewCell.swift
とMainTableViewCell.xib
が作られます。
①MainTableViewCell.xib
を選択
②ImageView
を配置
③Label
を配置
command + option + control + enterで2分割する
Imageをimg
という名前で、Lalbelをlabel
という名前で紐づける
①Class ViewController: UIView~~~
を以下のように書き換えましょう。
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
この時点ではエラーが出ています。
以下のようにするとエラーを自動で解消してくれます。
①まるぽちをクリック
②Fixをクリック
そうするとこのように自動で作られます。
しかし、@IBOutlet
やoverride func
の上にあるのはちょっと不自然なので、以下のようにコピペで下に移動させましょう。
TableViewを使うには、まずセルの数を決めなければなりません。
一つ目のfuncに以下のように追記しましょう。
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 10 }
override func viewDidLaod
を以下のように書き換えましょう。
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. tableView.register(UINib(nibName: "MainTableViewCell", bundle: nil), forCellReuseIdentifier: "customCell") }
ここでMainTableViewCell
を登録してるイメージです。
先ほど登録したセルをテーブルに表示させましょう。
2つ目のfunc tableView
を以下のように書き換えてください。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! MainTableViewCell return cell }
これで表示できました!
command + rで実行してみましょう。
このように10個Labelというセルが表示されると思います。
画像に何も設定していないし、Labelにも何も設定していないのでこんな感じになります。
2つ目のfunc tableView
を以下のように書き換えてください。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! MainTableViewCell cell.img.image = UIImage(systemName: "swift") cell.label.text = "Swift" return cell }
cell.img.image = UIImage(systemName: "swift")
でimageViewにswiftのアイコンを表示させています。
cell.label.text = "Swift"
でLabelにSwiftという文字を表示させています。
command + rで実行してみましょう。
このようになるはずです!
これでカスタムセルを使ったテーブルビューが完成しました!
初心者の方だと少し意味わかんなくなってしまうかもしれませんが、
ViewController.swiftではなく、MainTableViewCell.swiftに書いても同じように表示させることができます。
MainTaleViewCell.swift
のawaleFromNib()
に以下のように追記してください。
override func awakeFromNib() { super.awakeFromNib() // Initialization code img.image = UIImage(systemName: "swift") label.text = "Swift" }
これで実行してみても同じ結果になるはずです!
ViewController.swiftに書いてしまうと、ViewController.swiftのコードが長くなって読みづらくなってしまいます。
なので、なるべくMainTableViewCell.swiftに書いた方がいいと思います。
ViewController.swift
import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. tableView.register(UINib(nibName: "MainTableViewCell", bundle: nil), forCellReuseIdentifier: "customCell") } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 10 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! MainTableViewCell cell.img.image = UIImage(systemName: "swift") cell.label.text = "Swift" return cell } }
MainTableViewCell.swift
import UIKit class MainTableViewCell: UITableViewCell { @IBOutlet weak var img: UIImageView! @IBOutlet weak var label: UILabel! override func awakeFromNib() { super.awakeFromNib() // Initialization code img.image = UIImage(systemName: "swift") label.text = "Swift" } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } }
まとめ
ここまでカスタムセルについて解説してきました。
もし、エラーでできなかったら教えてください。改善します。
サトリク
独学でアプリ開発は厳しくないですか?
このブログ(satorikublog)の筆者サトリクが、初心者の方に教えるサービスをはじめました。
アプリリリースまで全力でサポートします。
気軽にご相談ください!
他にもアプリ開発についての記事を書いていますので、よかったら読んでみてください。