Table View の使い方 (Swift)

今回は iOS アプリの開発によく使われる Table View の使い方についてご説明します。

それぞれのステップのやり方の詳細がわからない場合は「 基本的な iOS アプリの作り方 」のページでご確認ください。

Table View とは?

Table View は iPhone の設定画面などでも使われている、iOS 開発に欠かせない View です。

Table View の使い方 (Swift) 1

テーブルにカラム(セル)が複数個表示されて、縦にスクロールすることができます。

カラムを選択した時に、その詳細画面を表示するような階層構造にとても良く使われます。


Table View と Table View Controller の違い

Table View を使うには、View Controller に Table View を追加して使う方法と、すでに Table View が組み込まれている Table View Controller を使う方法があります。

Table View の使い方 (Swift) 2

Table View Controller は Table View に必要なプロトコルの準拠とメソッドの実装などが既に準備されています。

便利な部分はあるのですが、Table View を位置の動かして、他のオブジェクトを配置したりすることができません。

その為、多くの iOS ディベロッパーは View Controller + Table View を使っています。

このページでは View Controller + Table View で使う方法をご紹介します。

Table View の使い方

それでは実際に Table View を使ってデータを表示するアプリを作ってみましょう。

まず、Xcode を立ち上げて、Create a new Xcode project で [App] を作ります。

Language は Swift で、User Interface には Storyboard を選択してください。

Table View の使い方 (Swift) 3

Table View を配置する

左側のプロジェクトナビゲーターで Main.storyboard を選択します。

右上の➕ボタンをクリックしてオブジェクトライブラリーを表示し、Table View を探して、View Controller にドラッグ&ドロップしてください。

Table View の使い方 (Swift) 4


そしてコンストレイントを追加します。Table View が選択された状態で、エディターエリアの画面の右下あたりにある [Add New Constraints] 用のボタンをクリックします。

上下左右に 0 を入力して[Add Constraints] ボタンをクリックします。

Xcode のバージョンによっては 0 のまま表示されたり、自動的に "Standard" に変換されたりしますが、そのままコンストレイントを追加してしまって大丈夫です。

Table View の使い方 (Swift) 5


Table View Cell を配置する

続けて、Table View Cell を配置します。

右上の➕ボタンをクリックしてオブジェクトライブラリーを表示し、Table View Cell を探して、Table View の上にドラッグ&ドロップしてください。

Table View の使い方 (Swift) 6


そして、Table View Cell が選択された状態で Style を Basic に変更し、Identifier に MyTableViewCell と設定してください。

Style と Identifier については後ほどご説明します。

Table View の使い方 (Swift) 7


Table View のアウトレットを生成する

次に Table View のアウトレットを生成します。

ストーリーボードで、Table View が選択された状態で、メニューから Editor > Assistant Editor を選択し Assistant Editor を開きます。

以下のように Adjust Editor Options ボタンの Assistant からでも Assistant Editor を開くことができます。

Table View の使い方 (Swift) 8


Assistant Editor が開いたら、開かれたファイルが ViewController.swift であることを確認してください。

先ほど配置した Table View を ⌃ Control キーを押しながら、ViewController.swift ファイルの、Class ViewController.. の下あたりにドラッグしてドロップして、myTableView という名前でアウトレットを作っておきます。

Table View の使い方 (Swift) 9

Table View の使い方 (Swift) 10

Table View の使い方 (Swift) 11

Table View に必須のメソッドを実装する

次は Table View に必須のメソッドを実装します。

Table View を使うには、dataSource と delegate を実装する必要があります。

左側のプロジェクトナビゲーターで ViewController.swift を選択すると、エディターエリアにソースコードが表示されます。

まず、ViewController クラスの UIViewController に続けて、UITableViewDelegate, UITableViewDataSource プロトコルを追加します。

Table View の使い方 (Swift) 12

tableView(_:numberOfRowsInSection:) と tableView(_:cellForRowAt:) のインスタンスメソッドを実装しなければならないのですが、Xcode の Fix を使うとスタブを生成してくれます。

Table View の使い方 (Swift) 13

Table View の使い方 (Swift) 14

スタブは上のほうに挿入されますが、下に移動させました。


そして、このクラス自身を myTableView のデータソースに指定するために viewDidLoad() に以下の 2 行を追加します。

myTableView.dataSource = self
myTableView.delegate = self

Table View の使い方 (Swift) 15

これで Table View を使う下準備は完了です。


Table View にデータを表示する

今回はデータ用にクラスなどを作らずに、以下の配列のデータを Table View に表示してみます。

let systemIcons = ["archivebox","trash","tray","folder","doc"]

値は有効なシステムアイコンの名前であれば何でも大丈夫です。

ViewController クラスの上のほうで systemIcons を定義しておきます。

Table View の使い方 (Swift) 16


続いてインスタンスメソッドを実装します。

tableView(_:numberOfRowsInSection:) のほうはセクション内の行の数を返す必要があります。

今回はセクションはひとつだけなので、次のように systemIcons 配列の要素数を返します。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return systemIcons.count
}

Table View の使い方 (Swift) 17


tableView(_:cellForRowAt:) のほうは、indexPath の位置に挿入する UITableViewCell を返す必要があります。

tableView(_:cellForRowAt:) インスタンスメソッドに次のようにコードを追加してください。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = myTableView.dequeueReusableCell(withIdentifier: "MyTableViewCell", for: indexPath)
    
    cell.textLabel?.text = systemIcons[indexPath.row]
    cell.imageView?.image = UIImage(systemName: systemIcons[indexPath.row])
    
    return cell
}

Table View の使い方 (Swift) 18

まず最初の行で dequeueReusableCell(withIdentifier:for:) を使って、myTableView から、先ほど Table View Cell に指定した "MyTableViewCell" という identifier を持つ UITableViewCell オブジェクトを取得しています。

dequeueReusableCell を使うと、毎回新しい UITableViewCell オブジェクトを生成するのではなく、再利用できる時は既存の UITableViewCell オブジェクトを再利用してくれます。

次の行では cell の textLabel プロパティに systemIcons 配列の indexPath.row 番目の要素を代入しています。

その次の行では、systemIcons 配列 の indexPath.row 番目の要素を systemName に指定して UImage を生成し、imageView プロパティに代入しています。

そして return cell でその cell を返しています。


これで Table View にデータを表示する為のコードを書き終わりました。

念のため ViewController.swift の全体のコードを載せておきます。

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    let systemIcons = ["archivebox","trash","tray","folder","doc"]
    
    @IBOutlet weak var myTableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        myTableView.dataSource = self
        myTableView.delegate = self
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return systemIcons.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = myTableView.dequeueReusableCell(withIdentifier: "MyTableViewCell", for: indexPath)
        
        cell.textLabel?.text = systemIcons[indexPath.row]
        cell.imageView?.image = UIImage(systemName: systemIcons[indexPath.row])
        
        return cell
    }
    
}

ビルドしてシミュレーターで実行する

それでは、ビルドして実行してみましょう。

ツールバー左側の ボタンをクリックすると、選択されているシミュレータが立ち上がり、アプリがインストールされて実行されます。

Table View の使い方 (Swift) 19

Table View の使い方 (Swift) 20

systemIcons 配列に入っているシステムアイコンとその名前が Table View に上から順番に表示されましたね。


Table View Cell の Style について

最後に、Table View Cell はカスタマイズすることも可能ですが、標準では textLabel、detailTextLabel、imageView という名前のプロパティが用意されています。

Table View Cell の Style には今回使った Basic の他に Right Detail、Left Detail、Subtitle が選択可能です。

それぞれのスタイルで textLabel、detailTextLabel、imageView がどのように表示されるのか、tableView(_:cellForRowAt:) インスタンスメソッドの中で次のように値を設定した時のサンプルを載せておきます。

cell.textLabel?.text = "Text Label"
cell.detailTextLabel?.text = "Detail Text Label"
cell.imageView?.image = UIImage(systemName: "archivebox")

Basic:
Table View Cell - Basic

Right Detail:
Table View Cell - Right Detail

Left Detail:
Table View Cell - Left Detail

Subtitle:
Table View Cell - Subtitle


以上、基本的な Table View の使い方についてご説明しました。

次回は、Table View Cell のカスタマイズの方法についてご紹介したいと思います。

© 2024 iOS 開発入門